/tmp/xyz.txt”); fp=fopen(“/tmp/xyz.txt”,“r+”); 如果(fp!=NULL){ i=fscanf(fp,“%s”,fname); 而(i!=EOF){ 睡眠(2); printf(“文件名为:'%s'\n',fname); sprintf(cmd,“rm-rf%s;touch/tmp/a_%d_new.msg”,fname,j++); 系统(cmd); memset(fname,0200); memset(cmd,0200); 系统(“ls/tmp/*.msg-rt1>/tmp/xyz.txt”); i=fscanf(fp,“%s”,fname);//经过一些迭代后,fscanf将返回错误 printf(“I值为:'%d'\n',I); } } 如果(fp!=NULL) fclose(fp); 返回0; },c,C" /> /tmp/xyz.txt”); fp=fopen(“/tmp/xyz.txt”,“r+”); 如果(fp!=NULL){ i=fscanf(fp,“%s”,fname); 而(i!=EOF){ 睡眠(2); printf(“文件名为:'%s'\n',fname); sprintf(cmd,“rm-rf%s;touch/tmp/a_%d_new.msg”,fname,j++); 系统(cmd); memset(fname,0200); memset(cmd,0200); 系统(“ls/tmp/*.msg-rt1>/tmp/xyz.txt”); i=fscanf(fp,“%s”,fname);//经过一些迭代后,fscanf将返回错误 printf(“I值为:'%d'\n',I); } } 如果(fp!=NULL) fclose(fp); 返回0; },c,C" />

C程序中fscanf的怪异行为 我想知道在下面的代码片断中为什么 fSCANF在执行的中间抛出1,由于这个原因,我没有得到想要的输出。 #include<stdio.h> #include<string.h> #include<malloc.h> int main(){ FILE *fp=NULL; char fname[200], cmd[200]; int i=0,j=0; system("ls /tmp/*.msg -1rt > /tmp/xyz.txt"); fp=fopen("/tmp/xyz.txt","r+"); if(fp!=NULL){ i=fscanf(fp,"%s",fname); while(i!=EOF){ sleep(2); printf("Filename is:'%s'\n",fname); sprintf(cmd, "rm -rf %s; touch /tmp/a_%d_new.msg",fname,j++); system(cmd); memset(fname, 0, 200); memset(cmd,0, 200); system("ls /tmp/*.msg -rt1 > /tmp/xyz.txt"); i=fscanf(fp,"%s",fname);// fscanf will return error after some iterations printf("The I Value is: '%d'\n",i); } } if(fp!=NULL) fclose(fp); return 0; } #包括 #包括 #包括 int main(){ FILE*fp=NULL; char fname[200],cmd[200]; int i=0,j=0; 系统(“ls/tmp/*.msg-1rt>/tmp/xyz.txt”); fp=fopen(“/tmp/xyz.txt”,“r+”); 如果(fp!=NULL){ i=fscanf(fp,“%s”,fname); 而(i!=EOF){ 睡眠(2); printf(“文件名为:'%s'\n',fname); sprintf(cmd,“rm-rf%s;touch/tmp/a_%d_new.msg”,fname,j++); 系统(cmd); memset(fname,0200); memset(cmd,0200); 系统(“ls/tmp/*.msg-rt1>/tmp/xyz.txt”); i=fscanf(fp,“%s”,fname);//经过一些迭代后,fscanf将返回错误 printf(“I值为:'%d'\n',I); } } 如果(fp!=NULL) fclose(fp); 返回0; }

C程序中fscanf的怪异行为 我想知道在下面的代码片断中为什么 fSCANF在执行的中间抛出1,由于这个原因,我没有得到想要的输出。 #include<stdio.h> #include<string.h> #include<malloc.h> int main(){ FILE *fp=NULL; char fname[200], cmd[200]; int i=0,j=0; system("ls /tmp/*.msg -1rt > /tmp/xyz.txt"); fp=fopen("/tmp/xyz.txt","r+"); if(fp!=NULL){ i=fscanf(fp,"%s",fname); while(i!=EOF){ sleep(2); printf("Filename is:'%s'\n",fname); sprintf(cmd, "rm -rf %s; touch /tmp/a_%d_new.msg",fname,j++); system(cmd); memset(fname, 0, 200); memset(cmd,0, 200); system("ls /tmp/*.msg -rt1 > /tmp/xyz.txt"); i=fscanf(fp,"%s",fname);// fscanf will return error after some iterations printf("The I Value is: '%d'\n",i); } } if(fp!=NULL) fclose(fp); return 0; } #包括 #包括 #包括 int main(){ FILE*fp=NULL; char fname[200],cmd[200]; int i=0,j=0; 系统(“ls/tmp/*.msg-1rt>/tmp/xyz.txt”); fp=fopen(“/tmp/xyz.txt”,“r+”); 如果(fp!=NULL){ i=fscanf(fp,“%s”,fname); 而(i!=EOF){ 睡眠(2); printf(“文件名为:'%s'\n',fname); sprintf(cmd,“rm-rf%s;touch/tmp/a_%d_new.msg”,fname,j++); 系统(cmd); memset(fname,0200); memset(cmd,0200); 系统(“ls/tmp/*.msg-rt1>/tmp/xyz.txt”); i=fscanf(fp,“%s”,fname);//经过一些迭代后,fscanf将返回错误 printf(“I值为:'%d'\n',I); } } 如果(fp!=NULL) fclose(fp); 返回0; },c,C,复制步骤: 创建/tmp/xyz.txt文件(无数据) >xyz.txt(如果有数据,请将其设为空) rm-rf*.msg 触摸a.msg b.msg c.msg d.msg e.msg f.msg 在这里,我期待着优雅地退出while循环。在当前场景中,由于fscanf功能,不会发生这种情况 我觉得第二次解释这个问题时我做得更好,所以下面是我更好的解释: 文件是一种有状态设备,包括EOF标志和缓冲区。如果在缓冲时到达文件末尾,那么它可能会在缓冲区中排队,并且缓冲区在耗尽之前不会被更新。实际上,

复制步骤:

  • 创建/tmp/xyz.txt文件(无数据)
  • >xyz.txt(如果有数据,请将其设为空)
  • rm-rf*.msg
  • 触摸a.msg b.msg c.msg d.msg e.msg f.msg

  • 在这里,我期待着优雅地退出while循环。在当前场景中,由于fscanf功能,不会发生这种情况

    我觉得第二次解释这个问题时我做得更好,所以下面是我更好的解释:

    文件
    是一种有状态设备,包括
    EOF
    标志和缓冲区。如果在缓冲时到达文件末尾,那么它可能会在缓冲区中排队,并且缓冲区在耗尽之前不会被更新。实际上,文件的一部分拷贝是在内存中创建的,当您对该文件进行外部更改时,内存中的拷贝将变得不同步

    解决方案是以某种方式同步缓冲区。如果更改文件位置,则标准库将别无选择,只能更新缓存版本并重置
    EOF
    标志。您有两个选择:


    • 回放
      是有意义的,如果您打算使用
      请显示数据文件包含的内容。您希望从空文件中读取什么?当输入用尽时,
      fscanf
      的正常返回值是返回
      EOF
      ,即
      -1
      。因此,循环应该在打印
      -1
      后立即退出。它将包含代码中生成的文件名。i、 e./tmp/a_5_new.msg/tmp/a_0_new.msgsprintf(cmd,“rm-rf%s;touch/tmp/a_%d_new.msg”,fname,j++);系统(“ls/tmp/*.msg-rt1>/tmp/xyz.txt”);请参阅代码中的以上两行,以了解文件是如何生成的,并且生成的文件的完整路径存储在xyz.txt文件中。请注意,
      ungetc()
      使用的1..n-char缓冲区可以与通过
      setbuf()
      /
      setvbuf()
      分配的缓冲区不同。(实际上这样实现起来更容易。)@DevSolar我回避了这个话题,因为似乎没有必要去理解问题可能是什么。你做得比我好得多,所以你得到了我的+1,希望能保留这条评论作为未来读者的补充。我不相信这会容易得多。如果将缓冲区实现为循环数组,则将光标向后移动一步似乎很简单。我认为系统调用必须支持循环数组,需要多个系统调用,或者可能存在我忽略的其他复杂性。不幸的是,我对内核的理解还不清楚。为什么在更新已经用文件指针打开的文件时,fscanf会返回EOF。如果我们为一个打开的文件指针更新一个文件,会有什么副作用呢?我只是用>>而不是>,尝试并更新了代码,观察到fscanf没有返回任何错误,但是循环是不确定的,所以在这种情况下,我能够到达EOF?.system(“ls/tmp/*.msg-rt1>>/tmp/abc.txt”);如果在连接之前擦除文件(例如,使用
      ),而不
      倒带文件,则会出现不稳定的行为;有时第一行可能是部分的,有时会返回
      EOF
      。这就是你看到的。如果不删除文件(例如,使用
      >
      进行附加),则循环可能无法到达
      EOF
      。这不是预期的吗,因为在测试之前,您会立即将数据写入文件?如果要达到
      EOF
      ,请不要在测试前立即写入文件。你想解决什么实际问题?