不太理解fputc(ch,fp)和putchar(ch)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不太理解fputc(ch,fp)和putchar(ch)相关的知识,希望对你有一定的参考价值。

putchar(ch); 函数原型 是 int putchar ( int character );
向标准输出设备 输出一个字符,也就是 向 屏幕 输出 一个 字符,让你知道已向文件里写了这个字符。
fputc(ch,fp); 是把 ch 输出到磁盘文件里去,磁盘文件就是 fp=fopen()里指明的
D:\cc\filename.dat 这个文件。
ch 的来源是 键盘输入: ch=getchar(); 当 ch=='#'时,循环结束,并关闭文件。
参考技术A 有什么不理解的?
fputc是写入文件,putchar是写到屏幕上。

ftell()函数如何工作?

我有这段代码,但我不明白它是如何工作的:

void print(char * fileName)

    FILE * fp;
    int ch;
    fp = fopen(fileName, "r");
    while (ftell(fp) < 20)
    
        ch = fgetc(fp);
        putchar(ch);
    
    fclose(fp);

因此,如果ftell(fp)处于循环状态,它将如何工作?因为循环内没有任何东西可以使它启动。它是如何进行的?

答案

[ftell()为您提供流的位置指示器的当前值(在您的情况下,它基本上返回当前指向的字符位置)。

fgetc()从指定的流中获取下一个字符(无符号字符),并使该流的位置指示符前进。此函数将以无符号字符形式读取的字符返回到文件结尾或错误处的int或EOF。

程序的流程

简单来说就是-

  • [fgetc()正在从文件中读取一个字符,然后前进指针到下一个字符。

  • ftell()返回当前位置,以字节为单位文件的开头。这意味着它会告诉它现在指向的字符的位置(因为1个字符占用1个字节)。

  • 因此,您的程序从文件读取,直到ftell()返回小于20的位置。这意味着它将保持循环播放,直到从文件中读取了20个字符

希望这消除了您的疑问!

另一答案

[ftell返回文件位置指示符的当前值,并且fgetc确实在循环内推进文件位置指示符。


但是此程序是错误的。对于以文本模式("r")打开的流,ftell的返回值除了寻找到上一个位置外,不能用于任何其他用途。来自C11 draft n1570 7.21.9.4p2

[...]对于文本流,其文件位置指示符包含未指定的信息,fseek函数可使用该信息将流的文件位置指示符返回到ftell调用时的位置;两个这样的返回值之间的差异不一定是对写入或读取的字符数的有意义的度量。

实际上,在此程序中使用ftell没有任何意义。可以在binary mode"rb"中打开文件,然后保证

[...]值是从文件开头开始的字符数。

或用于计数从[[文本文件中读取的字符,请使用计数器变量:

int c_read = 0; while (c_read < 20) ch = fgetc(fp); putchar(ch); c_read ++;
最后,如果文件的长度小于等于20个字符,则原始版本或我的原始版本都无法正常工作。在那种情况下,EOFfgetc返回,并且putchar会将(unsigned char)EOF写入流中(很可能是值255的字节!)

因此正确的代码应为

int c_read = 0; while (c_read < 20) ch = fgetc(fp); if (ch == EOF) // report the error perror("Failed to read 20 characters"); break; putchar(ch); c_read ++;

以上是关于不太理解fputc(ch,fp)和putchar(ch)的主要内容,如果未能解决你的问题,请参考以下文章

调用 get(fgetc) 和 putc(fputc) 函数进行输入输出

第13章第2讲文件读写操作

C语言中的标准函数都有哪些

C语言中的标准函数都有哪些?

读取文件内容

实验7