一、什么是文件
文件 是指一组相关数据的有序集合。这个数据集合有一个名称,叫做文件名。所有的文件都通过流进行输入、输出操作。与文本流和二进制流对应,文本可以分为 文本文件 和 二进制文件。
- 文本文件,也称 ASCII 文件。这种文件在保留的时,每一字符对应一个字节,用于存放对应的 ASCII 码。
- 二进制文件,不保存 ASCII 码,而是按二进制的编码方式来保存文件内容。
文件在程序中是以流的形式来操作的。流 是指数据源(文件)和程序(内存)之间的经历的路径。输入流 指的是数据从数据源(文件)到程序(内存)的路径。输出流 指的是数据从程序(内存)到数据源(文件)的路径。
当我们提到输入时,这意味着要向程序写入一些数据。输入可以是以文件的形式或命令行中进行。C语言 提供了一系列内置的函数来读取给定的输入,并根据需要写入到程序中。
当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C语言 提供了一些列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。
C语言 把所有的设备都当作文件,所以设备被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以访问键盘或屏幕。
标准文件 | 文件指针 | 设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 屏幕 |
标准错误 | stderr | 屏幕 |
二、文件的基本操作
文件的基本操作包括文件的打开和关闭,除了标准的输入、输出文件外,其它所有的文件都必须先打开再使用,而使用后也必须关闭该文件。
2.1、文件指针
文件指针是一个指向文件有关信息的指针,这些信息包括文件名、状态 和 当前位置,它们保存在一个结构体变量中。在使用文件时需要在内存中为其分配空间,用来存放文件的基本信息。该结构体类型是由系统定义的,C语言 规定该类型为 FILE 型,其声明如下:
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
2.2、文件的打开
fopen() 函数用来打开一个文件,打开文件的操作就是创建一个流。fopen() 函数的原型在 stdio.h 中,其函数原型如下:
FILE *fopen( const char *restrict filename, const char *restrict mode );
其中,filename 是指要被打开的文件的文件名,mode 是指对打开的文件要进行读操作还是写操作。
mode 的具体参数值如下:
文件的打开方式 | 含义 |
---|---|
r(只读) | 打开一个文件,只允许读操作,文件必须存在; (此操作下,文件必须存在) |
w(只写) | 打开或建立一个文本文件,只允许写操作; (如果文件不存在,则创建一个文件) (如果文件存在,则将覆盖此文件的内容) |
a(追加) | 打开一个文本文件,并在文件末尾写数据; (如果文件不存在,则创建一个文件) |
rb(只读) | 打开一个二进制文件,只允许读数据; |
wb(只写) | 打开或建立一个二进制文件,只允许写数据; |
ab(追加) | 打开一个二进制文件,并在文件末尾写数据; |
r+(读写) | 打开一个文本文件,允许读和写; (文件必须存在,原有的内容保留) |
w+(读写) | 打开或建立一个问及文本文件,允许读写; (如果文件不存在,则新建一个文件,重新写入的内容将覆盖原有所有内容) |
a+(读写) | 打开一个文件文本,允许读,或在文件末追加数据; (如果文件不存在,则新建一个文件) |
rb+(读写) | 打开一个二进制文件,允许读和写; |
wb+(读写) | 打开或建立一个二进制文件,允许读和写; |
ab+(读写) | 打开一个二进制文件,允许读,或在文件末追加数据; |
如果使用 fopen() 函数打开文件成功,则返回一个有确定执行的 FILE 类型指针;若打开失败,则返回 NULL;
通常打开文件失败的原因有以下几个方面:
- 指定的盘符或路径不存在;
- 文件名中含有无效字符;
- 以 r 模式打开一个不存在的文件;
2.3、文件的关闭
文件在使用完毕后,应使用 fclose() 函数将其关闭,fclose() 函数 和 fopen() 函数一样,函数原型也在 stdio.h 中,其函数原型如下:
int fclose( FILE *stream );
fclose() 函数也返回一个值,当正常完成关闭操作时,fcolse() 函数返回值为 0,否则返回 EOF。
在程序结束之前应关闭所有文件,这样做的目的是防止因为没有关闭文件而造成的数据流失;
三、文件的读写操作
3.1、fputc()与fgetc()函数
fputc() 函数的作用是把一个字符写到磁盘文件(strem所指向的文件)中去。如果函数写入成功,则返回值就是写入的字符;如果写入失败,就返回 EOF。fputc() 函数的一般形式如下:
int fputc( int ch, FILE *stream );
其中,ch 是要写入的字符,它可以是一个字符常量,也可以是一个字符变量。stream 是文件指针变量。
fgetc() 函数的作用是从指定的文件(fp 指向的文件)读入一个字符赋给指定的变量。该文件必须必须是以只读或读写的方式打开。当文件遇到文件结束符将返回一个文本结束标志 EOF。fgetc() 函数的一般形式如下:
int fgetc( FILE *stream );
其中,strem 表示要读取的文件对象;
#include <stdio.h>
int main()
{
FILE *fp;
char writeCh,readCh;
if((fp = fopen("E:\\text.txt","w")) == NULL) // 以只写模式打开文件
{
printf("打开文件失败");
return 0;
}
printf("请输入一个字符:");
scanf("%c",&writeCh);
if((fputc(writeCh,fp)) == EOF) // 写入一个字符
{
printf("写入失败!\n");
}
else
{
printf("写入成功!\n");
}
fclose(fp); // 关闭文件,保留写入的内容
if((fp = fopen("E:\\text.txt","r")) == NULL) // 以只读模式打开文件
{
printf("打开文件失败");
return 0;
}
readCh = fgetc(fp); // 从文件中读取一个字符
printf("从文件中读取的字符为:%c\n",readCh);
fclose(fp); // 关闭文件
return 0;
}
3.2、fputs()与fgets()函数
fputs() 函数与 fputc() 函数类似,区别在于 fputc() 函数每次指向文件写入一个字符,而 fputs() 函数每次向文件写入一个字符串,其中字符串可以是字符串常量,也可以是字符数组名、指针或变量。该函数不会字符串结尾的 '\0'写入。如果调用成功,返回一个非零值,否则返回 EOF。。fputs() 函数的一般形式如下:
int fputs( const char *restrict str, FILE *restrict stream );
其中,str 表示要写入的字符串,stream 表示要写入的文件指针。
fgets() 函数与 fgetc() 函数类似,区别在于 fgetc() 函数每次从文件中读出一个字符,而 fgets() 函数每次从指定的文件中读取一个字符串到字节数组中。当读取到换行符('\n')或文件结束符(EOF)表示读取结束。如果成功则返回 str 指向的地址,如果没读入任何字符遇到 EOF,则 str 会指向的位置保留原有的内容,函数返回 NULL。。fgets() 函数的一般形式如下:
char *fgets( char *restrict str, int count, FILE *restrict stream );
其中,str 用来存放从文件中读取的字符串,count 用来指定读取的字节数(包括 '\0'),strem 表示要读取的文件对象。
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char wiriteStr[100],readStr[100];
if((fp = fopen("E:\\text.txt","w")) == NULL) // 以只写模式打开文件
{
printf("打开文件失败");
return 0;
}
printf("请输入一个字符串:\n");
gets(wiriteStr);
if((fputs(wiriteStr,fp)) == EOF) // 写入一个字符串,不能写入中文
{
printf("写入失败!\n");
}
else
{
printf("写入成功!\n");
}
fclose(fp); // 关闭文件,保留写入的内容
if((fp = fopen("E:\\text.txt","r")) == NULL) // 以只读模式打开文件
{
printf("打开文件失败");
return 0;
}
fgets(readStr,strlen(wiriteStr)+1,fp); // 从文件中读取一个字符串
printf("从文件读取的字符串为:\n");
printf("%s\n",readStr);
fclose(fp); // 关闭文件
return 0;
}
3.3、fprintf()与fscanf()函数
fprintf() 函数与 printf() 函数类似,它们之间最大区别在于 fprintf() 函数读写的对象不是终端,而是文件。fprintf() 函数的一般形式如下:
int fprintf( FILE *restrict stream, const char *restrict format, ... );
其中,strem 表示要操作的文件对象,format 是格式化字符串,与 printf() 函数类似,由格式化占位符和普通字符组成。格式化占位符以 % 开头,用于指明参数值如何格式化。
fscanf() 函数与 scanf() 函数类似,它们之间最大区别在于 fscanf() 函数读写的对象不是终端,而是文件。fscanf() 函数的一般形式如下:
int fscanf( FILE *restrict stream, const char *restrict format, ... );
其中,strem 表示要操作的文件对象,format 是格式化字符串,与 scanf() 函数类似,由格式化占位符和普通字符组成。格式化占位符以 % 开头,用于指明参数值如何格式化。
#include <stdio.h>
int main()
{
FILE *fp;
char writeStr[100],readStr[100];
if((fp = fopen("E:\\text.txt","w")) == NULL) // 以只写模式打开文件
{
printf("打开文件失败");
return 0;
}
printf("请输入一个字符串:\n");
scanf("%s",writeStr); // 写入一个字符串,不能写入中文,字符串不能有空格
fprintf(fp,"%s",writeStr);
fclose(fp); // 关闭文件,保留写入的内容
if((fp = fopen("E:\\text.txt","r")) == NULL) // 以只读模式打开文件
{
printf("打开文件失败");
return 0;
}
fscanf(fp,"%s",readStr); // 从文件中读取一个字符串
printf("从文件中读取的字符为:\n");
printf("%s\n",readStr);
fclose(fp); // 关闭文件
return 0;
}
3.7、fwrite()与fread()函数
fwrite() 函数的作用是将 buffer 所指向的内容输出 count 次,每次写 size 字节到 stream 所指向的文件中。返回值是实际写入文件中的元素个数。fwrite() 函数的一般格式如下:
size_t fwrite( const void *restrict buffer, size_t size, size_t count, FILE *restrict stream );
其中,buffer 是一个指针,要写入文件的数据的地址,size 表示要写的字节数,count 表示要写多少个 size 字节的数据相,fp 表示要写入的文件。
fread() 函数的作用是从 stream 所指向的文件中读入 count 次,每次读 size 字节,读入的信息保存在 buffer 地址中。返回值是实际读取到的元素个数。fread() 函数的一般形式如下:
size_t fread( void *restrict buffer, size_t size, size_t count, FILE *restrict stream );
其中,buffer 是一个指针,要读入文件的数据的地址,size 表示要读的字节数,count 表示要读多少个 size 字节的数据相,stream 表示要写读的文件。
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char writeStr[100],readStr[100];
if((fp = fopen("E:\\text.txt","w")) == NULL) // 以只写模式打开文件
{
printf("打开文件失败");
return 0;
}
printf("请输入一个字符串:\n");
gets(writeStr);
fwrite(writeStr,sizeof(char),strlen(writeStr)+1,fp); // 连续写入一个字符到文件
fclose(fp); // 关闭文件,保留写入的内容
if((fp = fopen("E:\\text.txt","r")) == NULL) // 以只读模式打开文件
{
printf("打开文件失败");
return 0;
}
fread(readStr,sizeof(char),strlen(writeStr)+1,fp); // 从文件中连续读取一个字符
printf("从文件中读取的内容为:\n");
printf("%s\n",readStr);
fclose(fp); // 关闭文件
return 0;
}
四、文件的定位
4.1、fseek()函数
fseek() 函数的作用时移动文件内部位置指针,fseek() 函数的一般形式如下:
int fseek( FILE *stream, long offset, int origin );
其中,stream 指定要操作的文件对象。offset 表示要移动的字节数,要求位移量是 long 型数据,以文件长度大于 64KB 时不会出错。当用常量表示位移量时,要求加后缀 L。origin 表示从何处开始计算位移量,规定的起始点有 文件首、文件当前位置 和 文件尾。
起始点 | 表示符号 | 数字表示 |
---|---|---|
文件首 | SEEK_SEK | 0 |
文件当前位置 | SEEK_CUR | 1 |
文件尾 | SEEK_END | 2 |
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char writeStrp[100],readStr[100];
if((fp = fopen("E:\\text.txt","w")) == NULL) // 以只写模式打开文件
{
printf("打开文件失败");
return 0;
}
printf("请输入一个字符串:\n");
gets(writeStrp);
if((fputs(writeStrp,fp)) == EOF) // 写入一个字符串到文件中,不能写入中文
{
printf("写入失败!\n");
}
else
{
printf("写入成功!\n");
}
fclose(fp); // 关闭文件,保留写入的内容
if((fp = fopen("E:\\text.txt","r")) == NULL) // 以只读模式打开文件
{
printf("打开文件失败");
return 0;
}
fseek(fp,5L,0); // 文件指针偏移5
fgets(readStr,strlen(writeStrp)+1,fp); // 从文件中读取一个字符串
printf("从文件读取的字符串为:\n");
printf("%s\n",readStr);
fclose(fp); // 关闭文件
return 0;
}
4.2、rewind()函数
rewind() 函数的作用是使文件位置指针从新返回文件的开头,该函数没有返回值。rewind() 函数的一般格式如下:
void rewind( FILE *stream );
其中,stream 指要操作的文件对象。
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char writeStrp[100],readStr[100];
if((fp = fopen("E:\\text.txt","w")) == NULL) // 以只写模式打开文件
{
printf("打开文件失败");
return 0;
}
printf("请输入一个字符串:\n");
gets(writeStrp);
if((fputs(writeStrp,fp)) == EOF) // 写入一个字符串到文件中,不能写入中文
{
printf("写入失败!\n");
}
else
{
printf("写入成功!\n");
}
fclose(fp); // 关闭文件,保留写入的内容
if((fp = fopen("E:\\text.txt","r")) == NULL) // 以只读模式打开文件
{
printf("打开文件失败");
return 0;
}
fseek(fp,5L,0); // 文件指针偏移5
fgets(readStr,strlen(writeStrp)+1,fp); // 从文件中读取一个字符串
printf("从文件读取的字符串为:\n");
printf("%s\n",readStr);
rewind(fp); // 文件指针回到头部
fgets(readStr,strlen(writeStrp)+1,fp); // 从文件中读取一个字符串
printf("从文件读取的字符串为:\n");
printf("%s\n",readStr);
fclose(fp); // 关闭文件
return 0;
}
4.3、ftell()函数
ftell() 函数的作用是得到流式文件中的当前位置,用相对于文件开头的偏移量来表示。当 ftell() 函数返回 -1L 时,表示出错。ftell() 函数的一般形式如下:
long ftell( FILE *stream );
其中,stream 表示要操作的文件。
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char *str;
long position;
if((fp = fopen("E:\\text.txt","w")) == NULL) // 以只写模式打开文件
{
printf("打开文件失败");
return 0;
}
printf("请输入一个字符串:\n");
gets(str);
if((fputs(str,fp)) == EOF) // 写入一个字符串到文件中,不能写入中文
{
printf("写入失败!\n");
}
else
{
printf("写入成功!\n");
}
fclose(fp); // 关闭文件,保留写入的内容
if((fp = fopen("E:\\text.txt","w")) == NULL) // 以只读模式打开文件
{
printf("打开文件失败");
return 0;
}
fseek(fp,5L,0); // 文件指针偏移5
position = ftell(fp);
printf("文件指针当前位置为:%d\n",position);
fclose(fp); // 关闭文件
return 0;
}
标签:fp,文件,15,函数,写入,printf,操作,打开
From: https://www.cnblogs.com/kurome/p/17210936.html