2016-07-25 107 views
-2

我在研究输入/输出文件。下面的代码涉及到一些函数,如:fgetc(),fgets(),fputs()。我不知道为什么它不能像我想要的那样工作。非常感谢你!下面是我的代码:为什么输入“abc !!!”但输出不是“abC+++”?

#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); 
} 

+0

有关如何进行读取循环的提示,请参阅http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong –

回答

-1

也许,因为你打开文件只读:

fp = fopen("file.txt", "r"); /*open a file with only read mode*/ 
+0

我已更改为“r +”,但结果不变。我在Windows中使用eclipse –

+0

这个答案显然是错误的。请参阅monkeyStrix答案以解释原因。 'ungetc'不会尝试修改文件。 –

0

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

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

注意虽然,这只会影响上 流还输入操作,并没有的内容与其关联的物理文件, ,它不会被任何对此函数的调用修改。 (cplusplus.com)

此外,如果只保证连续一个使用该函数:

推回的字符将在相反的顺序返回;只有一个后退保证。 (linux手册)

+0

非常感谢!我知道这个文件没有改变,只有流才改变。但为什么我的代码运行不正确?当我使用ungetc()时有问题吗? –

+0

你可以重写我的代码,但仍然使用ungetc()函数?谢谢。 –

+0

谢谢!我取代了fgets(buffer,2,fp);和fputs(buffer,stdout);到printf(“%c”,fgetc(fp)); 并且结果为真 –

2

while循环中的逻辑有缺陷。

这是发生了什么:

getc的第一个字符,a

a不是!所以你ungetca回到流上。

然后你读了一整行。当然你会得到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只能在一个字符上安全地完成。保持ifungetc并更换fgets/fputs有以下几点:

fgets(buffer,1,fp);  // Read one character. 
    printf("%c", buffer[0]); // output one character from buffer to stdout 
+0

非常感谢!但我想使用ungetc()函数。你有其他方式仍然使用ungetc()函数吗? –

+0

@ ThuanTran正如monkeyStix所指出的那样,你只能安全地放弃一个角色。因此,如果您想使用'ungetc',则需要一次读取并打印一个字符。 Se在我的答案中增加了替代方案 –

+1

谢谢!我取代了fgets(buffer,2,fp);和fputs(buffer,stdout);到printf(“%c”,fgetc(fp)); 并且结果为真 –

0

你只是控制文件的第一个字符和控制,如果它是!或者没有,那么你读的是物流255个字节,并刷新到输出流。

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

相关问题