C语言----文件操作
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言----文件操作相关的知识,希望对你有一定的参考价值。
概念
1)文件指针
所有被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息,
这些信息是保存在一个系统声明为FILE结构体中
2)文件类型
数据文件被称为文本文件或者二进制文件
文本文件:在外存上以ASCII码的形式存储,需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件
二进制文件:在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件
3)文件缓冲区(相关函数)
系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。
如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
缓冲区的大小根据C编译系统决定的
int fflush( FILE *stream );
fflush()用于清空文件缓冲区,如果文件是以写的方式打开 的,则把缓冲区内容写入文件
4)Stream(流)
所有的I/O都以这个“流”类为基础的
C程序运行起来默认打开了三个流
stdin
标准输入流(键盘)stdout
标准输出流(屏幕)stderror
标准错误流(屏幕)
文件的打开和关闭
FILE * fopen ( const char * filename, const char * mode );
int fclose ( FILE * stream );
例
:FILE * pFile; pFile = fopen ("myfile.txt","w"); if (pFile!=NULL) { fputs ("fopen example",pFile); fclose (pFile); }
const char *mode | 作用 | 当文件打开失败 |
---|---|---|
"r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w"(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 出错 |
“rb”(只读) | 为了输入数据,打开一一个二进制文件 | 出错 |
“wb"(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab"(追加) | 向一个二进制文件尾添加数据 | 出错 |
"r+”(读写) | 为了读和写,打开-一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建议-个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
"rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
"wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+” (读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
文件操作函数
1)函数(顺序读写)
int fgetc( FILE *stream );
Read a character from a stream (fgetc, fgetwc)流 or stdout (_fgetchar, _fgetwchar).标准输入读取成功返回return the character read as an int(ASCII码),失败返回EOF(-1)
(返回值同fgetchar)
int fputc( int c, FILE *stream );
Writes a character to a stream (fputc, fputwc)流 or to stdout (_fputchar, _fputwchar).标准输出成功返回此character,失败返回EOF(-1)
(返回值同fputchar)
char *fgets( char *string, int n, FILE *stream );
Get a string from a stream.
n:读取的字符个数如“dsd\\0”表示4个,包括’\\0’读取成功返回字符串空间的起始地址,失败返回NULL
int fputs( const char *string, FILE *stream );
Write a string to a stream成功返回 a nonnegative value (非空值),失败返回EOF(-1)
int fscanf( FILE *stream, const char *format [, argument ]... );
格式化输入函数fscanf() 在进行第一次转换之前就已经到了末尾或者有读错误时 则其返回值为EOF(-1), 否则得话,则返回其成功转换的元素数目
int fprintf( FILE *stream, const char *format [, argument ]...);
格式化输出函数
fprintf returns the number of bytes written.returns a negative value instead when an output error occurs. 成功时返回写入成功的字节数,失败时返回NULL
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
size:每个元素大小
二进制输入返回值是实际读取到的数据个数(如果返回值小于count表示读取完成)
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
size:每个元素大小
二进制输出返回值是实际写入的数据个数
2)函数(其他函数)
int sprintf( char *buffer, const char *format [, argument] ... );
把格式化的数据写入某个字符串缓冲区。如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数
int sscanf( const char *buffer, const char *format [, argument ] ... );
从一个字符串中读进与指定格式相符的数据的函数,即sscanf会从buffer里读取数据,依照format的格式将数据写入到argument里如果成功,该函数返回成功匹配和赋值的个数 (返回值不包括已读取但未分配的字段)。
如果到达文件末尾或发生读错误,则返回 EOF
例子:
struct S { char arr[10]; int age; float f; }; int main() { struct S s = { "hello", 20, 5.5f }; struct S tmp = { 0 }; char buf[100] = {0}; //sprintf 把一个格式化的数据,转换成字符串 sprintf(buf, "%s %d %f", s.arr, s.age, s.f); printf("%s\\n", buf); //从buf字符串中还原出一个结构体数据 sscanf(buf, "%s %d %f", tmp.arr, &(tmp.age), &(tmp.f)); printf("%s %d %f\\n", tmp.arr, tmp.age, tmp.f);
3)printf/fprintf/sprintf,scanf/fscanf/sscanf区别
功能 | 针对 | |
---|---|---|
printf | 针对标准输入的格式化输入语句 | stdin |
fprintf | 针对所有输入的格式化输入语句 | stdin/文件 |
sprintf | 把一个格式化的数据转化为字符串 | stdin |
scanf | 针对标准输出的格式化输出语句 | stdout |
fscanf | 针对所有输出的格式化输出语句 | stdout/文件 |
sscanf | 把一个字符串转化为格式化的数据 | stdout |
4)函数(随机读写)
int fseek ( FILE * stream, long int offset, int origin );
根据文件指针的位置和偏移量来定位文件指针
offset:到首位置的字节数如果成功, fseek 返回0. 否则, 返回一个非0值. 在不能seeking的设备上, 返回值未定义.
注意三个关键字:
SEEK_CUR(文件指针现在指向的位置)
SEEK_END(文件末尾)
SEEK_SET(文件首)
long int ftell ( FILE * stream );
返回文件指针相对于起始位置的偏移量
void rewind ( FILE * stream );
让文件指针的位置回到文件的起始位置
5)函数(文件结束判定)
int feof( FILE *stream );
feof 会在第一次尝试读到文件末尾的操作返回一个非0值 . 如果当前位置不是文件末尾则返回0. There is no error return
注意
:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束
fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF,这时要找出触发EOF的原因就用feof
例子:
int c; // 注意:int,非char,要求处理EOF FILE* fp = fopen("test.txt", "r"); if(!fp) { perror("File opening failed"); return EXIT_FAILURE; } //fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环 { putchar(c); } //判断是什么原因结束的 if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) puts("End of file reached successfully"); fclose(fp);
以上是关于C语言----文件操作的主要内容,如果未能解决你的问题,请参考以下文章
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段