使用fseek()和EOF IN C进行更多理解

时间:2011-12-04 20:10:54

标签: c fopen eof fseek

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 我得到了 - >箭头标记并进入我达到无限循环 也用      fflush(标准输入); 它丢失了文件的地址并抓住了一些垃圾地址,

1 个答案:

答案 0 :(得分:1)

你有几个问题,我会把这个问题保存到最后。

首先,您的无限循环可能来自您使用getchar的方式。

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

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

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

接下来,我认为你根本不需要fseek,因为你的开放模式是“a +”,虽然它对我来说也不错 - 但是我不再使用C足以确定了。< / p>

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

scanf("%s",word);

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

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

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

)会更容易
char word [100];

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

奇怪的是,您似乎已经为fname解决了这个问题。这表明您可能会机器人地应用人们的建议来修复您的代码而不了解问题,这有点令人担忧。因此,我会向您发出警告 - 您目前似乎没有使用sent,但如果打算使用与wordfname相同的方式,它会遇到与word相同的问题。