【问题标题】:more understanding with fseek() and EOF IN C更多地理解 fseek() 和 EOF IN C
【发布时间】:2011-12-04 20:10:54
【问题描述】:

fseek 和 fseek 中的值 0L 这个值的含义也是 seek_end 的含义,也帮助我处理 EOF ctrl+z 不起作用

void modify()
{
 int ch1;
 FILE *f1;
 char c,*word,*sent,fname[20];
 printf("Enter the filename to be modified: ");
 scanf("%s",fname);
 if(searchpath(fname))
    {
    printf("\n1.Character");
    printf("\n2.Word");
    printf("\n3.Sentence");
    printf("\nEnter U'r choice: ");
    scanf("%d",&ch1);
    if(ch1==1)
       {
       f1=fopen(fname,"a+");//use to search the fiel in path variables
       fseek(f1, 0L, SEEK_END);
       printf("Enter the character and CTRL+Z to exit:\n ");
       while((c=getchar())!=EOF)
          {
          putc(c,f1);
          }
       }
    else if(ch1==2)
       {
       printf("Enter the word: ");
       scanf("%s",word);
       f1=fopen(fname,"a+");
       fseek(f1, 0L, SEEK_END);
       fputs(word,f1);
       }
    else
       {
       printf("Enter the sentence and CTRL+Z to exit: ");
       f1=fopen(fname,"a+");
       fseek(f1, 0L, SEEK_END);
       while((c=getchar())!=EOF)
         {
         putc(c,f1);
         }
       }
    }
 else
 printf("\nFilename does not exist");
 fclose(f1);
 }

当我运行代码并调用 printf("输入字符并按CTRL+Z退出:\n"); 而((c=getchar())!=EOF) { putc(c,f1); } 当我点击 ctrl+z 我得到 -> 箭头标记并输入我到达无限循环 也使用 刷新(标准输入); 它丢失了文件的地址并抓取了一些垃圾地址,

【问题讨论】:

    标签: c fopen eof fseek


    【解决方案1】:

    你有几个问题,我会把大的留到最后。

    首先,您使用getchar 的方式可能会导致您的无限循环。

    getchar 返回从标准输入读取的字符的值。如果出现错误或文件结束,它会返回 EOF(平台相关值,但通常为 -1)。但是,文件结束(可能取决于您的平台)只有在您在调用程序时将文件重定向到标准输入时才会真正发生 - 即如果有一个文件可以结束。

    在某些平台上,CTRL-Z 可能会被解释为文件结尾,CTRL-D 也可能如此,但这肯定不是通用的,我不确定它们中的任何一个。

    如果 CTRL-Z 不被解释为文件结尾,它可能有两种可能的结果。一种是强制中断您的程序,有点像 Windows 命令提示符中的 CTRL-Break。另一个是 CTRL-Z 被视为与任何其他按键一样的按键,可能导致从 getchar 返回字符代码 26。

    接下来,我认为您根本不需要 fseek,因为您的打开模式是“a+”,尽管它对我来说也没有错 - 但我不再使用 C 来确定。

    最后 - 我也认为你在如何使用 scanf 方面存在严重问题,这会导致严重的未定义行为。采取以下行...

    scanf("%s",word);
    

    您的变量word 定义如下...

    char c,*word,*sent,fname[20];
    

    好的,它是一个指向字符的指针 - 但该指针未初始化。您需要一个内存缓冲区来保存输入文本,并且您需要初始化指针。通常,将word 声明为字符数组会更容易,例如...

    char word [100];
    

    这确保有一些内存可用于保存结果字符串,但不能保证内存缓冲区足够大。这一点对于现实世界的编程来说是一个严肃的问题,但目前您可能不应该担心这一点。

    奇怪的是,您似乎已经为fname 解决了这个问题。这表明您可能会在不了解问题的情况下自动应用人们的建议来修复您的代码,这有点令人担忧。因此,我会给您一个警告-您目前似乎没有使用sent,但是如果打算以与wordfname相同的方式使用它,它将有同样的问题word 有。

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多