-3

我正在研究输入/输出文件。下面的代码涉及一些函数,例如:fgetc()、fgets()、fputs()。我不知道为什么它不能完全按照我的意愿工作。非常感谢!下面是我的代码:

#include <stdio.h>
int main()
{
   FILE *fp; //FILE type pointer
   int c; //using to get each character from file
   char buffer [256]; //array as buffer to archive string

    fp = fopen("file.txt", "r"); /*open a file with only read mode*/
   if( fp == NULL ) 
    {
      perror("Error in opening file");
       return(-1);
    }
     while(!feof(fp)) /*check if has not yet reached to end of file*/
     {
       c = getc (fp); //get a character from fp          
       if( c == '!' )
      {
         ungetc ('+', fp); //replace '!' by '+'

      }
      else
      {
         ungetc(c, fp); //no change
      }
       fgets(buffer,255,fp);//push string of fp to buffer
       fputs(buffer, stdout); //outputting string from buffer to stdout
    }
    return(0);
 }

4

4 回答 4

2

while 循环中的逻辑是有缺陷的。

这就是发生的事情:

getc是第一个角色,a

a不是一个!让你ungetc a回到流中的。

然后你读了一整行。你当然得到abc!!!

然后打印该行。输出:abc!!!

如果要操作字符串,最好操作缓冲区而不是尝试修改流:

   int i;
   int len = fgets(buffer,255,fp);//push string of fp to buffer
   for (i=0; i < len; i++) {
        if (buffer[i] == '!') {
             buffer[i] = '+';
        }
   }
   fputs(buffer, stdout); //outputting string from buffer to stdout

作为替代方案,如果您真的想使用ungetc,则需要一次读取/打印一个字符,因为ungetc只能在一个字符上安全地完成。保留if和 并将其ungetc替换fgets/fputs为以下内容:

   fgets(buffer,1,fp);       // Read one character. 
   printf("%c", buffer[0]); // output one character from buffer to stdout
于 2016-07-25T07:53:25.313 回答
0

您只需控制文件的第一个字符并控制是否存在,!然后从该流中读取 255 个字节并将其刷新到输出流。

对于从该文件读取 255 个字节后的输入文件(abc!!!在您的示例中),使 feof() 返回 True 并中断您的循环,因为没有什么可读取的。

于 2016-07-25T08:02:09.653 回答
0

正如另一个答案所指出的那样,错误发生了,因为您只测试文件中的第一个字符,然后从中读取 255 个字节,而不是一次抓取一个字节并进行测试。

另外,需要注意的重要一点是 ungetc 只影响流而不影响文件:

但请注意,这只会影响对该流的进一步输入操作,而不影响与其关联的物理文件的内容,任何对此函数的调用都不会修改物理文件的内容。(cplusplus.com)

此外,该功能如果只保证连续使用一次:

被推回的字符将以相反的顺序返回;只保证一次回击。(Linux手册)

于 2016-07-25T07:51:25.160 回答
-1

也许,因为您以只读方式打开文件:

fp = fopen("file.txt", "r"); /*open a file with only read mode*/
于 2016-07-25T07:46:27.150 回答