
1.从文本文件中读出数据的系统函数
从文本文件中读出数据需要调用在stdio.h头文件中声明的fgetc()函数或fgets()函数。
int fgetc(FILE* stream);
//从文件中读出一个字符并返回。若读到文件结束标记则返回-1。
读写指针:当打开一个文件用来从中读取数据时,系统就自动设置一个读文件指针,并使它的初值为0,即初始指向文件的开始位置上。若一个文件内容为n个字节,则对应的字节编号依次为0、1、2、…、n-1,在文件的最后位置,即编号为n的位置上保存着文件结束标记字符EOF(-1)。
当打开一个文件用来向其写入数据时,系统就自动设置一个写文件指针,并使它的初值为0,但对于追加写方式,则写文件指针的初值为n,因为需要把内容依次写入到文件的末尾。
每次从打开的文件中读写一个数据时,就是按照文件读写指针的位置进行,然后读写指针向后移动到新的位置上,移动的字节数等于所读写数据的字节数。
char* fgets(char* str, int length, FILE* stream);
//从文件中读出一行字符并保存到str字符数组空间,同时返回str值,
//若没有读到任何内容则返回空指针NULL。
若当前行的字符数为20,待保存数据的字符数组长度为9,则需要3次读完该行:8、8、4。
若保存数据的字符数组长度为12,则需要2次读完该行:11、9
若保存数据的字符数组长度>20,则只需要1次读完该行:20
从文本文件中读出数据的程序举例
例1:从由上面例1的程序所建立的“d:\\xxk\\wr1.dat”文本文件中,读出全部数据并依次显示到屏幕上。
分析:该wr1.dat文件中保存着26个小写英文字母和0-9数字字符。解决此题的程序应首先以只读方式打开wr1.dat文件;接着从文件中循环读出每个字符,并输出到屏幕上显示出来,直到文件结束符为止;最后关闭文件,结束程序。
#include<stdio.h>
#include<stdlib.h>
void main(void) {
char ch;
FILE* f3=fopen("d:\\xxk\\wr1.dat","r");
if (!f3) { //对打开失败的处理
printf("不能够打开文件!\n");
exit(1);
} //接着对文件的处理过程
ch=fgetc(f3);
while(ch!=EOF) {
printf("%c",ch);
ch=fgetc(f3);
}
printf("\n");
fclose(f3);
}
程序运行结果
abcdefghijklmnopqrstuvwxyz0123456789
例2:从由上面例2程序所建立的“d:\\xxk\\wr2.dat”文本文件中,按行读出全部数据,并把它们依次显示到屏幕上,同时统计出文件内容的全部行数。
分析:同例3的程序编写思路相同,首先以只读方式打开文件并返回文件流;接着读出文件中的每行字符,并进行显示和统计;最后关闭文件。
#include<stdio.h>
#include<stdlib.h>
void main(void) {
int i=0;
char str[80];
FILE* f4=fopen("d:\\xxk\\wr2.dat", "r");
if (!f4) {printf("文件没有打开!\n"); exit(1);}
while(!feof(f4)) { //判文件结束否
char* p=fgets(str,80,f4);
if(!p) break;
printf("%s",str);
i++; //行数增1
}
printf("文件中的行数为: %d\n",i);
fclose(f4);
}
例3:编写一个程序,把当前工作目录中的chapter8_4.c程序文件,复制到d盘xxk子目录下的wr3.dat数据文件中。
分析:在此题的程序中要打开两个文本文件,一个是以只读方式打开的chapter8_4.c程序文件,另一个是以只写方式打开的"d:\\xxk\\wr3.dat"数据文件。
文件处理过程为:依次地从只读文件中读出每个字符,把它写入到只写文件中。
把文本文件的复制功能用一个单独的函数定义模块来完成。函数名用progCopy表示,它带有2个字符指针参数,一个用来接收被复制的文本文件名,另一个用来接收复制到的目的文本文件名。
有了文本文件复制功能的函数模块,程序中的主函数只要给出2个文件名字符串和进行一次progCopy函数调用即可。
#include<stdio.h>
#include<stdlib.h>
void progCopy(char* fm1, char* fm2);
void main(void) {
char* p1="chapter8_4.c";
char* p2="d:\\xxk\\wr3.dat";
progCopy(p1,p2);
}
//ProgCopy函数的定义:
void ProgCopy(char* fm1, char* fm2) {
FILE *fin, *fout;
fin=fopen(fm1,"r");
fout=fopen(fm2,"w");
if(fin==NULL || fout==NULL) {
printf("Cannot open File.\n");
exit(1);
}
//接下来为文件复制过程:
while(1) {
char ch=fgetc(fin);
if(ch==EOF) break;
fputc(ch,fout);
}
fclose(fin); fclose(fout);
}