全站搜索未启用
跳到主要内容

文本四:文本文件的输入访问操作

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

}

最后修改: 2019年09月26日 Thursday 19:16