(6)fread()和 fwrite()
1.函数介绍
fread()和 fwrite()都是四个参数:
fread()是将从文件中(stream)读取 count 个大小为 size 的数据输入到 以 ptr 指引的空间中。
fwrite()是将ptr引领的空间的 count 个大小为 size 的数据,输出到文件 (stream)中。
2.代码展示:
#include <stdio.h> int main() { char arr[] = { 'C','h','i','a','n' }; //打开文件, 打开方式只写 FILE* pFile = fopen("test.txt", "w"); if (pFile == NULL) { perror("fopen File"); return 1; } fwrite(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), pFile); //关闭文件 fclose(pFile); //打开文件, 打开方式只读 pFile = fopen("test.txt", "r"); if (pFile == NULL) { perror("fopen File"); } struct S s1 = { 0 }; //从文件中读取输入 char arr1[10] = { 0 }; fread(arr1, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), pFile); for (int i = 0; i < 10; i++) { printf("%c ", arr1[i]); } //关闭文件 fclose(pFile); return 0; }
3.运行效果:
对比一组函数:
scanf/fscanf/sscanf printf/fprintf/sprintf
这里我们主要先介绍,sscanf()和 sprintf():
sscanf()可以从指定的字符串中读取格式化数据,并且返回读取的数据个数。如果读取失败就返回,EOF。
cprintf()可以将打印的字符串存储到指定的字符数组中,并返回字符串的字符数。如果读取失败返回。一个负数。
#include <stdio.h> int main() { int i = 0; char str1[50] = { 0 }; char str2[50] = { 0 }; char str[] = "you are 18 years old"; int n = sscanf(str, "%s %s %d", str1, str2, &i); printf("str1 : %s\n",str1); printf("str2 : %s\n",str2); printf("i = %d\n", i); printf("%d data were read from [%s].\n", n, str); printf("------------------------------------------------------\n"); int age = 19; char str3[50] = { 0 }; int m = sprintf(str3, "I am %d years old", age); printf("[%s]is a string %d chars long\n", str3, m); return 0; }
代码运行效果:
总体来看:
scanf():按照一定的格式从键盘输入数据。
printf():按照一定的格式把数据打印到(输出)到屏幕上。
适用于标准输入输出 /输出流的格式化的输入/输出语句。
fscanf():按照一定的格式从输入的流(文件/stdio)输入数据。
fprintf():按照一定的格式向输出流(文件/stdout)输出数据。
适用于所有的输入/输出流的格式化输入/输出语句。
sscanf():从字符串中按照一定的格式读取格式化的数据。
sprintf():把格式化的数据按照一定的格式转换成字符串
文件的随机读写
(1)fseek():
根据文件指针的位置和偏移量来定位文件指针。
stream:是文件流。
offset :偏移量。
origin :偏移位置
偏移位置有三个:
1.代码:(以SEEK_CUR为例)
#include <stdio.h> int main() { FILE* pFile; pFile = fopen("hello.txt", "wb"); if (pFile == NULL) { perror("fopen"); return 4; } //在文件中行输出" This is an apple. ",此时文件指针的偏移位置是字符串的最后。 fputs("This is an apple.", pFile); //从当前文件指针的偏移位置,向后偏移9个位置。 fseek(pFile, 9, SEEK_CUR); //从文件的偏移位置处行输出" sam". fputs(" sam", pFile); fclose(pFile); return 0; }
2.运行效果:
(2)ftell()
返回文件指针相对于起始位置的偏移量。
1.代码:
#include <stdio.h> int main() { FILE* pFile; pFile = fopen("hello.txt", "wb"); if (pFile == NULL) { perror("fopen"); return 4; } //在文件中行输出" This is an apple. " fputs("This is an apple.", pFile); long int num = ftell(pFile); fclose(pFile); printf("The offset position of the pFile is %ld . ", num); return 0; }
2.执行效果:
(3)rewind()
让文件指针的位置回到文件的起始位置。
1.代码:
#include <stdio.h> int main() { int n; FILE* pFile; char buffer[27]; pFile = fopen("myfile.txt", "w+"); for (n = 'A'; n <= 'Z'; n++) { //文件顺序写入[ A-Z ],此时文件的偏移位置在文件的最后面。 fputc(n, pFile); } //重置偏移位置到文件的开始 rewind(pFile); //顺序读取 大小为 1 字节,读取 26 个。 fread(buffer, 1, 26, pFile); fclose(pFile); //将数组最后一个赋值为 '\0'. buffer[26] = '\0'; puts(buffer); return 0; }
2.运行效果:
文件读取结束的判定
(1)被错误使用的feof
牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
1.文本文件读取是否结束,判断返回值是否为 EOF ,或者 NULL
fgetc():
当函数读取成功时返回文件指针偏移位置指向的字符,文件指针再向后移动一位。
当读取到文件的末位时,返回EOF并设置文件结束标志符(feof)。
如果发生读取错误,函数将返回EOF并设置流的错误指示符(feror)。
fputc():
成功后,返回所写字符。
如果发生写入错误,将返回EOF并设置错误指示器(feror)。
fgets():
成功时,函数返回str。
如果在尝试读取字符时遇到文件结尾,则设置EOF指示符(feof)。
如果在读取任何字符之前发生这种情况,则返回的指针为空指针(str的内容保持不变)。
如果发生读取错误,则会设置错误指示符(ferror)并返回空指针(但str指示的内容可能已更改)。
fputs():
成功时,返回非负值。
出错时,函数返回EOF并设置错误指示器(feror)。
fscanf():
成功时,函数返回参数列表中成功填充的项目数。
如果在读取时发生读取错误或达到文件结尾,则设置正确的指示器(feof或feror)。而且,如果在成功读取任何数据之前发生这两种情况,则返回EOF。
fprintf():
成功时,返回写入的字符总数。
如果发生写入错误,则设置错误指示符(feror)并返回负数。
fread():
返回成功读取的元素总数。
如果此数字与count参数不同,则可能发生读取错误,或者在读取时到达文件结尾。在这两种情况下,都设置了适当的指示器,可以分别用feror和feof进行检查。
fwrite():
返回成功写入的元素总数。
如果此数字与count参数不同,则写入错误会阻止函数完成。在这种情况下,将为流设置错误指示器(feror)。
文本文件和二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文
本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而
二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。
文件缓冲区:
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序
中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装
满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓
冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根
据C编译系统决定的。
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题。
最后:
今天很开心
以后我的名字也是会被她用来拒绝别人的理由之一啦!