-1

ctrlfseek和fseek 中的值 0L 这个值的含义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("Enter the character and CTRL+Z to exit:\n"); while((c=getchar())!=EOF) { putc(c,f1); 当我单击ctrl+z我得到 -> 箭头标记并输入时,我也使用 fflush(stdin); 到达无限循环;它丢失了文件的地址并获取了一些垃圾地址,

4

1 回答 1

1

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

首先,您的无限循环可能是您使用getchar.

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

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

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

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

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

scanf("%s",word);

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

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

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

char word [100];

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

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

于 2011-12-05T00:23:15.990 回答