首页 理论教育C语言读写单个字符数据

C语言读写单个字符数据

【摘要】:在C程序中,可以通过标准库函数fgetc和fputc实现在文件中单个字符(字节)数据的读写。函数fputc的功能是将用变量c表示的字符数据写到与文件指针stream相关联的文件中去,写入数据的位置由文件的读写位置指针指定,fputc函数执行成功时返回被输出的字符值,当函数执行发生错误时则返回EOF(-1)。编写程序实现功能:将从键盘上输入的若干字符数据写入文本文件mydata.txt。编写程序实现功能:统计一篇英文文章中单词的个数。

在C程序中,可以通过标准库函数fgetc和fputc实现在文件中单个字符(字节)数据的读写。这两个函数的原型分别为:

int fgetc(FILE*stream);

int fputc(int c,FILE*stream);

函数fgetc的功能是从与文件指针stream相关联的文件中读取一个字符(字节)数据,读取数据的位置由文件的内部读写位置指针指定,fgetc函数执行成功时返回其读取的字符,当执行fgetc函数时遇到文件结束符或者在执行中出错时返回EOF(-1)。

函数fputc的功能是将用变量c表示的字符数据写到与文件指针stream相关联的文件中去,写入数据的位置由文件的读写位置指针指定,fputc函数执行成功时返回被输出的字符值,当函数执行发生错误时则返回EOF(-1)。

【例7.1】 编写程序实现功能:将从键盘上输入的若干字符数据写入文本文件mydata.txt。(提示:需要结束键盘输入时,输入ctrl+z(EOF)后按回车键

上面程序运行时,首先建立/打开了名为mydata.txt的文本文件(注意到文件模式用的是"w",所以当指定的文件不存在时会创建一个新文件,如指定的文件已经存在则会将其打开,然后删除文件中原有的全部数据内容),然后将键盘上提供的字符序列依次写入文件中。

【例7.2】 编写程序实现功能:从文件mydata.txt(程序ex0501.c创建)中读出所有字符数据,并在系统标准输出设备显示器上输出。

上面程序运行时,首先打开了名为mydata.txt的文本文件(注意文件模式用的是"r",所以当指定的文件不存在或是指定的路径不对时都不能正确打开文件),然后用字符(字节)的方式依次读出文件中的所有字符并在显示器上显示。

【例7.3】 编写能够实现文件复制功能的程序。文件名在程序运行时从键盘提供,要求:(www.chuimin.cn)

①文件数据复制部分使用单独的函数实现。

②程序既能实现文本文件的复制,又能够实现二进制文件的复制。

上面程序运行时,首先使用两个字符数组接收键盘上提供的文件名,然后使用它们打开了两个被操作的文件(注意打开文件时用变量的形式表示的文件名)。然后调用函数filecopy实现文件复制工作。具体实现复制功能时,调用函数fgetc(in)从源文件读出一个字节的数据到变量ch中,然后调用函数feof(in)判断读出的是文件中的有效数据还是文件结尾符,如果是有效数据则调用函数fputc(ch,out)将ch中的内容写入目标文件,然后再读出下一个文件数据;如果读出的不是有效数据(此时feof(in)调用的值为非0),则表示已经读到了文件尾,通过break语句退出循环,结束复制过程。返回主函数后关闭两个文件,当关闭目标文件(写的文件)时,系统会在文件数据末尾为文件做一个结尾符号。

函数filecopy中实现文件内容复制部分的代码段切忌写成下面表示的形式:

while(!feof(in))

fputc(fgetc(in),out);

使用这种表示形式,看似比较简洁,也没有语法错误,而且也可以进行文件内容的复制工作。但被复制生成的文件内容会比源文件多出一个字节来,究其原因是因为在这段代码的操作过程中违反了计算机程序设计中“写类”操作应该先判断是否能够写,然后再执行写操作的原则,将源文件中的文件结尾符号写入目标文件后才判断是否遇到了源文件中的文件结束标志。在最后执行文件关闭函数调用时又写了一个文件结束标志,因而在复制生成的目标文件中会多出一个字节来。

【例7.4】 编写程序实现功能:统计一篇英文文章(文本文件)中单词的个数。

上面程序中的标准库函数isalpha的功能是判断其参数ch是否是英文字母,ch是英文字母时返回非0值,否则返回0值。程序中使用变量compart作为单词分隔符标志,当读到单词分隔符(非英文字母)时置1(compart=1),代表上一个单词的结束(或者还没进入下一个单词),当遇到单词的首字符时统计单词数,同时将标志变量compart置0以保证每个单词只统计一次。