C fgets何时停止读一行?

C fgets何时停止读一行?,c,debugging,while-loop,fgets,C,Debugging,While Loop,Fgets,我正在用gdb调试我的程序,fgets(line,sizeof(line),fp2)不从文本文件中读取任何内容。所以程序在端循环无穷大,而(!feof(fp2))和EOF从未满足,我不知道为什么 我把部分代码放在上下文中 以下是输入文件: COPY START 1000 FIRST STL RETADR CLOOP JSUB RDREC LDA LENGTH COMP ZERO JEQ ENDF

我正在用gdb调试我的程序,fgets(line,sizeof(line),fp2)不从文本文件中读取任何内容。所以程序在
端循环无穷大,而(!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+模式。
我认为在读取模式下关闭和打开更安全。

我相信这已经得到了很好的解决,如果您替换
而(!feof(fp2))
-->
而(!feof(fp2)和&!ferror(fp2))
我相信这已经得到了很好的解决,如果您替换
而(!feof(fp2))
-->
而(!feof(fp2)和&!ferror(fp2))的话,问题就会得到解决)

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

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

好的,问题是,您有一个文件打开模式
“w”

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

fp2 = fopen("intermediate.asm", "r");
文件打开模式为

  • w-写入(如果存在,则删除文件)
  • r-读取(文件必须存在)
  • a-附加
  • 您有
    +
    符号,表示:

  • w+-写入和读取(如果文件存在,则覆盖)
  • r+-读写(文件必须存在)
  • +追加并读取(如果文件不存在,则创建文件)

  • 好的,问题出在这里,您有
    “w”
    作为文件打开模式

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

    fp2 = fopen("intermediate.asm", "r");
    
    文件打开模式为

  • w-写入(如果存在,则删除文件)
  • r-读取(文件必须存在)
  • a-附加
  • 您有
    +
    符号,表示:

  • w+-写入和读取(如果文件存在,则覆盖)
  • r+-读写(文件必须存在)
  • +追加并读取(如果文件不存在,则创建文件)

  • 拿,读,和。你能把代码剥离到最小的例子来说明问题吗?你在输出流上调用
    fgets
    feof
    的可能重复的代码,你期望会发生什么呢?是的,我用原来的帖子跟踪,然后所有的代码都在我面前更改了。我想OP没有继承人guzzintas带着他们的Cumzouta过来了。但是,(!feof())无论如何都是错误的。@topcat您不能从用mode
    “w”打开的文件中读取数据
    拿,读,和。你能把代码精简到演示问题的最小示例吗?你在输出流上调用
    fgets
    feof
    的可能重复的代码,你期望会发生什么呢?a,我正在用原始帖子跟踪,然后所有的代码都在我面前更改了。我认为P的guzzintas与cumzoutas交叉。但是,(!feof())无论如何都是错误的。@topcat您无法从以模式
    “w”