基于C的文件操作 ,在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作
一、流式文件操作
#include <stdlib.h> #include <iostream> using namespace std; int main() { FILE* fp; //创建文件指针 errno_t err = fopen_s(&fp, "ss.txt", "w+"); //fopen_s打开文件成功返回0,失败返回非0的错误代码 /* 参数1:fp 文件指针 参数2:要读写的文件 参数3:模式 r 以只读方式打开文件,该文件必须存在。 r+ 以可读写方式打开文件,该文件必须存在。 rb+ 读写打开一个二进制文件,允许读数据。 rt+ 读写打开一个文本文件,允许读和写。 w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到
文件尾,即文件原先的内容会被保留。(EOF符保留) a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加
到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留) wb 只写打开或新建一个二进制文件;只允许写数据。 wb+ 读写打开或建立一个二进制文件,允许读和写。 wt+ 读写打开或着建立一个文本文件;允许读写。 at+ 读写打开一个文本文件,允许读或在文本末追加数据 ab+ 读写打开一个二进制文件,允许读或在文件末追加数据 */ int a= fputc('X', fp);//向流写一个字符 //成功返回这个字符的ASCII吗,失败返回EOF int b = fseek(fp,0, SEEK_SET);//定位读写指针 /* 参数1:文件指针 参数2:偏移量--字符数 参数3:移动的基准 SEEK_SET 0 文件开头 SEEK_CUR 1 当前读写的位置 SEEK_END 2 文件尾部 返回值:成功返回0 */ rewind(fp); //把读写指针移到文件头 int c=fgetc(fp);//从流中读一个字符 /* 返回值:成功返回这个字符,失败返回EOF */ int e = fclose(fp);//关闭文件 //如果成功,返回0,失败返回EOF cout << c << endl; }
FILE* fp; errno_t err = fopen_s(&fp, "ss.txt", "w+"); char aa[] = "liming"; int a=fputs(aa,fp); //写一个字符串到流中 //返回值:函数返回一个非负值,如果发生错误则返回 EOF rewind(fp); char bb[10]; char* c= fgets(bb,6,fp); //从流中读一行或指定个字符 /* 参数1:用来保存数据的字符串 参数2:最多读取n-1个字符,如果读取了一行(不包括行尾的'/n') 参数3:文件指针 返回值:如果成功则返回参数1的指针,否则返回NULL */ int e = fclose(fp); cout << c << endl;
int a= fprintf(fp, "%s","Hahaha"); //按格式输入到流 //其用法和printf()相同
char ss[10]; //int b=fscanf_s(fp, "%s", ss, 8); //按格式从流中读取 /* 参数4:最多读取的字符数(注意:这个最多读取的字符数的大小是包括的末尾的(' ')NULL的) 所以实际上最多可以读取的字符只有8-1=7个字符, 由于参数3 %s 是读取一个单词,所以如果文件中能够读取的字符串长度
大于9,那么fscanf_s不会向ss数组中读入任何内容,只将数组第一个元素赋值为' ' 注意:单词间隔符:遇到空格、换行符才结束 */ //与上面不同的是,我们在格式控制符%s这个加了一个宽度控制,意思是最多读取5个字符 int b = fscanf_s(fp, "%5s", ss, 8); //注意:参数4不要小于5 //此时最多读取5个字符,读写指针就在读取到的位置 cout << ss << endl; b = fscanf_s(fp, "%5s", ss, 8); cout << ss << endl; b = fscanf_s(fp, "%5s", ss, 8); cout << ss << endl;
int b = feof(fp);//检测是否已到文件尾,是返回真,否则返回0
#include <stdlib.h> #include <iostream> using namespace std; int main() { FILE* fp; errno_t err = fopen_s(&fp, "ss.txt", "w+"); int a[] = { 10,20,30,40,50,60,70,80 }; int len = sizeof(a) / sizeof(a[0]); unsigned long num = fwrite(a, sizeof(a[0]), len, fp);//向流steam写数据 /* 参数1:要写入的数组指针 参数2:要被写入的每个元素的大小,以字节为单位-unsigned long 参数3:元素的个数-unsigned long 参数4:文件指针 返回值:失败返回-1;成功返回写入的数据个数; */ printf("写了%d个数据 ", num); int b[8]; rewind(fp); num = fread(b, sizeof(int), 8, fp);//读取数据 /* 参数1:用来保存数据的char*;注意大小要大于等于读取的字节数 参数2:要读取的每个元素的大小,以字节为单位 参数3:元素的个数 参数4:文件指针 返回值:失败返回-1;成功返回读取的数据个数 */ for (int i = 0; i < 8; i++) { printf("b[%d]=%d ", i, b[i]); } printf("读了%d个数据 ", num); int n = fclose(fp); }
二、直接I/O文件操作
这是C提供的另一种文件操作,它是通过直接存/取文件来完成对文件的处理,而上篇所说流式文件操作是通过缓冲区来进行;流式文件操作是围绕一个FILE指针来进行,而此类文件操作是围绕一个文件的"句柄"来进行,什么是句柄呢?它是一个整数,是系统用来标识一个文件(在WINDOWS中,句柄的概念扩展到所有设备资源的标识)的唯一的记号
【VS2017好像修改了,没有找到详细教程】