【问题标题】:When does fgets stop reading a line?fgets 什么时候停止读取一行?
【发布时间】:2018-03-29 02:49:25
【问题描述】:

我正在使用 gdb 调试我的程序,fgets(line, sizeof(line), fp2) 不会从文本文件中读取任何内容。所以程序在while(!feof(fp2)) 处无限循环,并且从未遇到过EOF,我不知道为什么?

我将部分代码用于上下文,

这里是输入文件:

  COPY   START  1000
  FIRST  STL    RETADR
  CLOOP  JSUB   RDREC
         LDA    LENGTH
         COMP   ZERO
         JEQ    ENDFIL
  ZERO   WORD   0
  RETADR RESW   1
  LENGTH RESW   1
  BUFFER RESB   4096



         RSUB
         END    FIRST

这里是主程序:

int main(int argc, char *argv[])
{

    FILE *fp, *fp2, *fphex;
    char line[1000] = "" ;


    if (argc != 2)
    {
        printf("Usage: %s filename\n", argv[0]);
        exit(EXIT_FAILURE);
    }


    if ((fp = fopen(argv[1], "r")) == NULL)
    {
        printf("Can't open %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }

    fp2 = fopen("intermediate.asm", "w");
    fp2 = removecomment(fp,fp2);
    rewind(fp2);

    while (!feof(fp2))
    {
        fgets(line, sizeof(line), fp2);   /*this fgets reads only 4 bytes of empty spaces*/ 
        parse(line);

    }
    struct node *print = head;
    fphex = fopen("Hex_code", "w");

    while(print == NULL)
    {
        fprintf(fphex, "%s", print->instruction);
        print = print->next;
    }

    return(0);
}

编辑:

虽然(!feof(File*pointer) 不是问题。

我试图从只写 fopen 文件中读取。

我通过fclose(file) fopen("file","r")解决了它 或其他人建议的 w+ 模式。 我认为在阅读模式下关闭和打开更安全。

【问题讨论】:

  • 选择tour,阅读How to Askminimal reproducible example。你能把这段代码分解成能说明问题的最小例子吗?
  • 您在输出流上调用fgetsfeof,您希望发生什么
  • 是的,我正在使用原始帖子进行跟踪,然后所有代码都在我面前发生了变化。我认为 OP 的 guzzintas 与他们的 cumzoutas 交叉。但是 while(!feof()) 无论如何都是错误的。
  • @topcat 您无法从以"w" 模式打开的文件中读取

标签: c debugging while-loop fgets


【解决方案1】:

好的,问题来了,你有"w"作为文件打开模式。

fp2 = fopen("intermediate.asm", "w");

应该是

fp2 = fopen("intermediate.asm", "r");

文件打开方式是

  1. w - 写入(如果存在则删除文件)
  2. r - 读取(文件必须存在)
  3. a - 追加

比你有+ 符号这意味着:

  1. w+ - 写入和读取(如果文件存在则覆盖)
  2. r+ - 读写(文件必须存在)
  3. a+ - 追加和读取(如果文件不存在则创建文件)

【讨论】:

    【解决方案2】:

    fp2 是在写模式“w”下打开的,所以它必须先关闭,然后在读模式“r”下打开,这样才能正确读取行,人们可能会发现它而不是说它 While(!feof(fp2) )。

    【讨论】:

      【解决方案3】:

      我相信here这个问题已经解决了,如果你替换while(!feof(fp2))就会解决 ---> while(!feof(fp2) && !ferror(fp2))

      【讨论】:

        猜你喜欢
        • 2011-05-23
        • 2014-08-13
        • 2020-03-18
        • 2018-02-17
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多