C语言中没有输入输出语句,所有的输入输出函数都是由ANSI C提供的一套标准库函数实现的。文件操作标准库函数有:

# 打开文件

1.函数原型

FILE *fopen(char *pname,char *mode)

二、功能说明

按照模式指定的方式打开 pname 指定的文件。 如果找不到 pname 指定的相应文件,请按以下方式之一进行:

(1)此时如果模式规定以写模式打开文件,则根据pname指定的名称新建一个文件;

(2)此时如果mode指定以读取方式打开文件,就会出错。

打开一个文件的效果是:

(1)为打开的文件赋一个FILE类型的文件结构变量,并将相关信息填入文件结构变量;

(二)开辟缓冲区;

(3)调用操作系统提供的打开文件或新建文件函数,打开或新建指定文件;

FILE *:指出fopen是一个返回文件类型的指针函数;

三、参数说明

pname:是一个字符指针,它将指向要打开或创建的文件的文件名字符串。

mode:是一个指向文件处理模式字符串的字符指针。 所有可能的文件处理方法如表 8.1 所示

4.返回值

正常返回:打开文件的文件指针

异常返回:NULL,表示打开操作不成功。

例如:

//定义一个名叫fp文件指针   FILE *fp;   
//判断按读方式打开一个名叫test的文件是否失败   
if((fp=fopen("test""r")) == NULL)//打开操作不成功  
{      printf("The file can not be opened.n");           exit(1);//结束程序的执行  
}

需要注意的是,C语言是把计算机的输入输出设备看成文件的。 例如键盘文件、屏幕文件等。ANSI C标准规定,当程序执行时,系统自动打开键盘、屏幕和错误这三个文件。 这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准错误stderr。

* 关闭文件

1.函数原型

int fclose(FILE *fp);

二、功能说明

关闭 fp 指向的文件。 此时调用操作系统提供的文件关闭函数关闭fp->fd指向的文件; 释放fp指向的文件类型结构变量; 返回运算结果,即0或EOF。

三、参数说明

fp:指向打开文件的文件指针。

4.返回值

正常回报:0。

异常返回:EOF,表示关闭文件时出错。

例如:

int n=fclose(fp);

* 文件读写操作

A. 从​​文件中读取一个字符

1.函数原型

int fgetc(FILE *fp);

二、功能说明

从 fp 指向的文件中读取一个字符。

三、参数说明

fp:这是一个文件指针,指向要从中读取字符的文件。

4.返回值

正常返回:返回读取字符的代码。

异常返回:返回EOF。 例如,试图从一个“为写入而打开”的文件中读取一个字符会导致错误并返回 EOF。

5.例子

[示例 8.1] 显示指定文件的内容。

//程序名为:display.c   //执行时可用:display filename1 形式的命令行运行。显示文件filename1中的内容。例如,执行命令行display display.c将在屏幕上显示display的原代码。   //File display program.   #include    void main(int argc,char *argv[]) //命令行参数   {   
    int ch;//定义文件类型指针   
    FILE *fp;//判断命令行是否正确   
    if(argc!=2)   
    {   
        printf("Error format,Usage: display filename1n");   
        return; //键入了错误的命令行,结束程序的执行   
    }   
    //按读方式打开由argv[1]指出的文件   
    if((fp=fopen(argv[1],"r"))==NULL)   
    {   
        printf("The file  can not be opened.n",argv[1]);//打开操作不成功   
        return;//结束程序的执行   
    }   
    //成功打开了argv[1]所指文件   
    ch=fgetc(fp); //从fp所指文件的当前指针位置读取一个字符   
    while(ch!=EOF) //判断刚读取的字符是否是文件结束符   
    {   
        putchar(ch); //若不是结束符,将它输出到屏幕上显示   
        ch=fgetc(fp); //继续从fp所指文件中读取下一个字符   
    } //完成将fp所指文件的内容输出到屏幕上显示   
    fclose(fp); //关闭fp所指文件   }

B. 向文件写入一个字符

1.函数原型

int fputc(int ch,FILE *fp)

二、功能说明

将ch中的字符写入fp指向的文件。

三、参数说明

ch:整型变量,内存中要写入文件的字符(C语言中整型和字符可以通用)。

fp:这是一个文件指针,指向要写入字符的文件。

4.返回值

正常返回:要写入的字符代码。

异常返回:返回EOF。 例如,当试图将字符写入“打开以供读取”的文件时,会发生错误并返回 EOF。

5.例子

[示例 8.2] 将一个文件的内容复制到另一个文件。

//程序名为:copyfile.c   
//执行时可用:copyfile filename1 filename2形式的命令行运行,将文件filename1中的内容复制到文件filename2中去。  
//file copy program.   #include  
void main(int argc,char *argv[]) //命令行参数   {      int ch;      FILE *in,*out; //定义in和out两个文件类型指针      if(argc!=3) //判断命令行是否正确      {          printf("Error in format,Usage: copyfile filename1 filename2n");          return; //命令行错,结束程序的执行      }      //按读方式打开由argv[1]指出的文件      if((in=fopen(argv[1],"r"))==NULL)      {          printf("The file can not be opened.n",argv[1]);          return; //打开失败,结束程序的执行      }      //成功打开了argv[1]所指文件,再      //按写方式打开由argv[2]指出的文件      if((out=fopen(argv[2],"w"))==NULL)      {          printf("The file %s can not be opened.n",argv[2]);          return; //打开失败,结束程序的执行      }      //成功打开了argv[2]所指文件      ch=fgetc(in); //从in所指文件的当前指针位置读取一个字符      while(ch!=EOF) //判断刚读取的字符是否是文件结束符      {          fputc(ch,out); //若不是结束符,将它写入out所指文件          ch=fgetc(in); //继续从in所指文件中读取下一个字符      } //完成将in所指文件的内容写入(复制)到out所指文件中      fclose(in); //关闭in所指文件      fclose(out); //关闭out所指文件   }

【例8.3】以小数点和字符显示文件编码,不能显示的字符用井号“#”代替。

//程序名为:dumpf.c   
//执行时可用:dumpf filename1 形式的命令行运行。  
// File dump program.  
#include  
void main(int argc,char *argv[])   {      char str[9];      int ch,count,i;      FILE *fp;      if(argc!=2)      {          printf("Error format,Usage: dumpf filenamen");          return;      }      if((fp=fopen(argv[1],"r"))==NULL)      {          printf("The file %s can not be opened.n",argv[1]);          return;      }      count=0;      do{          i=0;          //按八进制输出第一列,作为一行八个字节的首地址          printf("o: ",count*8);          do{              // 从打开的文件中读取一个字符              ch=fgetc(fp);              // 按十进制方式输出这个字符的ASCII码              printf("%4d",ch);              // 如果是不可示字符就用"#"字符代替              if(ch<' '||ch>'~') str[i]='#';              // 如果是可示字符,就将它存入数组str以便形成字符串              else str[i]=ch;              // 保证每一行输出八个字符              if(++i==8) break;          }while(ch!=EOF); // 遇到文件尾标志,结束读文件操作          str[i]=''; // 在数组str加字符串结束标志          for(;i<8;i++) printf(" "); // 一行不足八个字符用空格填充          printf(" %sn",str); // 输出字符串          count++; // 准备输出下一行      }while(ch!=EOF); // 直到文件结束      fclose(fp); // 关闭fp所指文件   }

C. 从文件中读取一个字符串

1.函数原型

char *fgets(char *str, int n, FILE *fp)

二、功能说明

从fp指向的文件中读取n-1个字符,存入str指向的字符数组中,最后加上一个字符串终止符''。

三、参数说明

str:接收字符串的内存地址,可以是数组名,也可以是指针。

n:指出要读取的字符数。

fp:这是一个文件指针,指示要从中读取字符的文件。

4.返回值

正常返回:返回字符串的首内存地址,即str的值。

异常返回:返回NULL值。 这时候就应该使用feof()或者ferror()函数来判断是否读到文件末尾或者出错了。比如要从一个“write open”的文件中读取一个字符串,把

发生错误并返回 NULL 值。

D. 将字符串写入文件

1.函数原型

int fputs(char *str,FILE *fp)

二、功能说明

将str指向的字符串写入fp指向的文件。

三、参数说明

str:指出要写入文件的字符串。

fp:这是一个文件指针,表示要写入字符串的文件。

4.返回值

正常返回:写入文件的字符数,即字符串的长度。

异常返回:返回一个NULL值,此时应该使用feof()或ferror()函数判断是否读取

已到达文件末尾,但发生错误。 例如,要将字符串写入“读取打开”文件,

发生错误并返回 NULL 值。

5.例子

[示例 8.4] 以下程序将一个文件的内容附加到另一个文件。

//程序名:linkfile.c   
//执行时可用:linkfile filename1 filename2形式的命令行运行,将文件filename2的内容附加在文件filename1之后。  
// file linked program.  
#include   #define SIZE 512  
void main(int argc,char *argv[])   {      char buffer[SIZE];      FILE *fp1,*fp2;      if(argc!=3)      {          printf("Usage: linkfile filename1 filename2n");          return;      }      // 按追加方式打开argv[1] 所指文件      if((fp1=fopen(argv[1],"a"))==NULL)      {          printf("The file %s can not be opened.n",argv[1]);          return;      }      if((fp2=fopen(argv[2],"r"))==NULL)      {          printf("The file %s can not be opened.n",argv[2]);          return;      }      // 读入一行立即写出,直到文件结束      while(fgets(buffer,SIZE,fp1)!=NULL)          printf("%sn",buffer);      while(fgets(buffer,SIZE,fp2)!=NULL)          fputs(buffer,fp1);      fclose(fp1);      fclose(fp2);      if((fp1=fopen(argv[1],"r"))==NULL)      {          printf("The file %s can not be opened.n",argv[1]);          return;      }      while(fgets(buffer,SIZE,fp1)!=NULL)          printf("%sn",buffer);      fclose(fp1);   }

E. 向文件写入格式化数据

1.函数原型

int fprintf(FILE *fp,char *format,arg_list)

二、功能说明

将变量表列(arg_list)中的数据按照format指示的格式写入fp指定的文件中。 fprintf() 函数与 printf() 函数具有相同的功能,只是 printf() 函数将数据写入屏幕文件(stdout)。

三、参数说明

fp:这是一个文件指针,表示写入数据的文件。

format:这是一个字符指针,指向一个字符串,里面包含了要写入的数据的格式,所以这个字符串就变成了格式化字符串。 格式字符串描述的规则与 printf() 函数中的格式字符串相同。

arg_list:是要写入文件的变量列表,变量之间用逗号隔开。

4.返回值

没有任何。

5.例子

【8.5】以下程序的执行文件为display.exe,执行时输入命令行:

显示 [-i][-s] 文件名

下表列出了命令行参数的含义及其作用:

//存储文件名:save.txt   
//程序代码如下:  
// file display program.  
#include   void main()   {      char name[10];      int nAge,nClass;      long number;      FILE *fp;      if((fp=fopen("student.txt","w"))==NULL)      {          printf("The file %s can not be opened.n","student.txt");          return;      }      fscanf(stdin,"%s %d %d %ld",name,&nClass,&nAge,&number);      fprintf(fp,"%s %5d %4d %8ld",name,nClass,nAge,number);      fclose(fp);      if((fp=fopen("student.txt","r"))==NULL)      {          printf("The file %s can not be opened.n","student.txt");          return;      }      fscanf(fp,"%s %d %d %ld",name,&nClass,&nAge,&number);      printf("name nClass nAge numbern");      fprintf(stdout,"%-10s%-8d%-6d%-8ldn",name,nClass,nAge,number);      fclose(fp);   }

G.以二进制形式读取文件中的数据

1.函数原型

int fread(void *buffer,unsigned sife,unsigned count,FILE *fp)

二、功能说明

从fp指定的文件中,以二进制形式读取sife*c​​ount数据到buffer指向的数据区。

三、参数说明

buffer:这是一个void指针,指向要存放读取数据的存储区的首地址。

sife:数据块的字节数,即数据块的大小。

count:指出一次读入多少个数据块(sife)。

fp:这是一个文件指针,指出要从中读取数据的文件。

4.返回值

正常返回:实际读取数据块的个数,即count。

异常返回:如果文件中剩余数据块的个数小于参数中count所指示的个数,或者发生错误,则返回0。此时可以通过feof()和ferror()来判断是什么发生了

健康)状况。

H. 以二进制形式将数据写入文件

1.函数原型

int fwrite(void *buffer,unsigned sife,unsigned count,FILE *fp)

二、功能说明

以二进制形式,将buffer指定的数据缓冲区中的sife*c​​ount数据写入fp指定的文件中。

三、参数说明

buffer:这是一个void指针,指向要输出到文件的缓冲区的首地址。

sife:数据块的字节数,即数据块的大小。

count:一次输出多少个数据块(sife)。

fp:这是一个文件指针,指出要从中读取数据的文件。

4.返回值

正常返回:实际输出数据块的个数c读取txt文件每一行,即count。

异常返回:返回0值c读取txt文件每一行,表示输出结束或发生错误。

5.例子

【例8.7】

#include    
#define SIZE 4   struct worker   
{ int number;   
    char name[20];   
    int age;   
};   
void main()   {   
    struct worker wk;   
    int n;   
    FILE *in,*out;   
    if((in=fopen("file1.txt","rb"))==NULL)   
    {   
        printf("The file %s can not be opened.n","file1.txt");   
        return;   
    }   
    if((out=fopen("file2.txt","wb"))==NULL)   
    {   
        printf("The file %s can not be opened.n","file2.txt");   
        return;   
    }   
    while(fread(&wk,sizeof(struct worker),1,in)==1)   
        fwrite(&wk,sizeof(struct worker),1,out);   
    fclose(in);   
    fclose(out);   
}

一、读取二进制形式的整数

1.函数原型

int putw(int n,FILE *fp)

二、功能说明

从 fp 指定的文件中读取二进制形式的整数。

三、参数说明

fp:是文件指针。

4.返回值

正常返回:读取的整数值。

异常返回:返回EOF,即-1。 由于读取到的整数值可能为-1,所以必须使用feof()或ferror()来判断是文件末尾还是发生了错误。

5.例子

【例8.8】

#include    
void main(int argc,char *argv[])   {   
    int i,sum=0;   
    FILE *fp;   
    if(argc!=2)   
    {   
        printf("Command error,Usage: readfile filenamen");   
        exit(1);   
    }   
    if(!(fp=fopen(argv[1],"rb")))   
    {   
        printf("The file %s can not be opened.n",argv[1]);   
        exit(1);   
    }   
    for(i=1;i<=10;i++) sum+=getw(fp);   
    printf("The sum is %dn",sum);   
    fclose(fp);   
}

J. 以二进制形式存储一个整数

1.函数原型

int feof(FILE *fp)

二、功能说明

将变量 n 指向的整数值以二进制形式存储到 fp 指定的文件中。

三、参数说明

n:要存储在文件中的整数。

fp:是文件指针。

4.返回值

正常返回:输出的整数值。

异常返回:返回EOF,即-1。 由于输出的整数值可能是-1,所以必须使用feof()或ferror()来判断是文件结束还是出错。

5.例子

【例8.9】

c读取txt文件每一行_c 读取ftp上txt文件_c语言读取txt文件内容

* 文件状态检查

A. 文件结尾

(1) 函数原型

int feof(FILE *fp)

(2) 功能说明

该函数用于判断文件是否结束。

(3) 参数说明

fp:文件指针。

(4)返回值

0:假值,表示文件没有结束。

1:真值,表示文件结束。

(5) 例子

【例8.10】

#include    
void main(int argc,char *argv[])   {   
    FILE *in,*out;   
    char ch;   
    if(argc!=3)   
    {   
        printf("Usage: copyfile filename1 filename2n");   
        return;   
    }   
    if((in=fopen(argv[1],"rb"))==NULL)   
    {   
        printf("The file %s can not be opened.n",argv[1]);   
        return;   
    }   
    if((out=fopen(argv[2],"wb"))==NULL)   
    {   
        printf("The file %s can not be opened.n",argv[2]);   
        return;   
    }   
    while(!feof(in))   
    {   
        ch=fgetc(in);   
        if(ferror(in))   
        {   
            printf("read error!n");   
            clearerr(in);   
        }   
        else   
        {   
            fputc(ch,out);   
            if(ferror(out))   
            {   
                printf("write error!n");   
                clearerr(out);   
            }   
        }   
    }   
    fclose(in);   
    fclose(out);   
}

B.文件读写错误

(1) 函数原型

int ferror(FILE *fp)

(2) 功能说明

检查 fp 指定文件的读写错误。

(3) 参数说明

fp:文件指针。

(4)返回值

0:假值,表示没有错误。

1:真值,表示错误。

C.清除文件错误标志

(1) 函数原型

void clearerr(FILE *fp)

(2) 功能说明

清除 fp 指定文件的错误标志。

(3) 参数说明

fp:文件指针。

(4)返回值

没有任何。

(5) 例子

【例8.12】

#include    
void main(int argc,char *argv[])   {   
    FILE *in,*out;   
    char ch;   
    if(argc!=3)   
    {   
        printf("Usage: copyfile filename1 filename2n");   
        return;   
    }   
    if((in=fopen(argv[1],"rb"))==NULL)   
    {   
        printf("The file %s can not be opened.n",argv[1]);   
        return;   
    }   
    if((out=fopen(argv[2],"wb"))==NULL)   
    {   
        printf("The file %s can not be opened.n",argv[2]);   
        return;   
    }   
    while(!feof(in))   
    {   
        ch=fgetc(in);   
        if(ferror(in))   
        {   
            printf("read error!n");   
            clearerr(in);   
        }   
        else   
        {   
            fputc(ch,out);   
            if(ferror(out))   
            {   
                printf("write error!n");   
                clearerr(out);   
            }   
        }   
    }   
    fclose(in);   
    fclose(out);   
}