C/C++文件读写操作(二进制文件&文本文件)

您所在的位置:网站首页 LabVIEW读取二进制文件文本显示 C/C++文件读写操作(二进制文件&文本文件)

C/C++文件读写操作(二进制文件&文本文件)

2024-06-13 08:48| 来源: 网络整理| 查看: 265

1. C++文件读写操作

包含的头文件是fstream,ifstream是文件输入流,ofstream是文件输出流。 打开文件方式为ofstream fout(file_name, ios::out|...|...)或者ofstream fout; fout.open(file_name, ios::out|...|...)。

打开模式说明ios::in为输入打开文件;文件不存在则打开失败,文件存在则打开。(ifstream默认打开方式)ios:out为输出打开文件;文件不存在则创建打开,文件存在则清空。(ofstream默认打开方式)ios::nocreate文件存在的时候不起作用,文件不存在的时候,强制文件不存在也不创建,此项针对输出文件打开。ios::noreplace不覆盖文件,若打开文件时如果文件存在则失败。文件不存在时,参数无效。文件存在时,此选项对ios::in无效,但是对于ios::out有效,当文件存在时打开失败。ios::binary文件默认是以文本形式打开的,此模式为二进制模式打开。ios::trunc若文件不存在,则无效,若文件存在首先清空里面的内容。ios::app所有的输出附加在文件末尾,读操作与写操作共享指针,具有读文件的特性,与ios::out组合使用的时候不清空文件内容。ios::ate文件指针的初始位置在文件尾。 1.1 C++操作文本文件 1.1.1 写文件 #include #include using namespace std; int main() { ofstream fout("out.txt",ios::out); //默认是ios::trunc /*读文件*/ if(!fout.is_open()) { exit(1); } char ch; while(!(EOF == (ch =getchar()))) //ctrl + z { fout exit(1); } char ch; fin >> noskipws; //不跳过空格和回车 //默认跳过空格和回车 //读取单个字符 /*while(!fin.eof()) { fin >> ch; cout public: int a; char b[10]; char c; }; int main() { ofstream fout("out.dat",ios::out | ios::binary); if(!fout.is_open()) exit(1); MyClass mc; while(cin >> mc.a >> mc.b >> mc.c) { fout.write((char*)&mc, sizeof(mc));//mc的地址就是要写入内存文件缓冲区的地址 } fout.close(); return 0; } 1.2.2 读文件

istream & read(char* buffer, int count); int gcount();

#include #include #include using namespace std; class MyClass{ public: int a; char b[10]; char c; }; int main() { ifstream fin("out.dat",ios::in | ios::binary); if(!fin.is_open()) exit(1); MyClass mc; while(fin.read((char*)&mc, sizeof(mc))) { int cnt_bytes = fin.gcount();//查看刚才读取了多少字节 cout fprintf(fp, "%d ",a); } fclose(fp); return 0; } 2.1.2 读文件 #include #include #include int main() { FILE* fp = fopen("in.txt", "r");//只读方式打开文件 if (!fp) exit(1);//读文件失败 int mode = 1; printf("mode为1, 按字符读入并输出; mode为2, 按行读入并输出;\n请输入mode: "); scanf("%d", &mode); if (mode == 1) { //按字符读入并直接输出 char ch;//读取的字符 /*while (EOF != (ch = fgetc(fp)))//是否为文件结束符 printf("%c", ch);*/ while(EOF != fscanf(fp, "%c", &ch)) printf("%c", ch); } else if (mode == 2)//按行读入并输出 { char line[100]; memset(line, 0, 100); while (!feof(fp)) { fgets(line, 100, fp); printf("%s", line); //输出 } } fclose(fp); return 0; } 2.2 C操作二进制文件 2.2.1 写文件

此处要注意的就是在写结构体数据的时候,因为char c变量是字符,因此要注意要在每次输入结构体之后吃掉回车符,否则会导致输入失败,就像我在代码中写的那样,用空格来吃掉前面的空白字符(包括回车 空格等)。

#include #include #include typedef struct MyStruct{ int a; char b[10]; char c; }MyStruct; int main() { FILE* fp = fopen("test.dat", "wb+");//读写打开或建立一个二进制文件,允许读和写。 if (!fp) exit(1);//写文件失败 /*写int数据*/ /*int a; while(scanf("%d", &a)) fwrite(&a, sizeof(int), 1, fp);//写入int数据*/ /*写结构体数据*/ MyStruct ms; //先将结构体存储在结构体数组中 //MyStruct ms[4]; //MyStruct *p = ms; /*for(int i = 0; i < 4; i++,p++) { scanf(" %d", &p->a); scanf(" %s", p->b); scanf(" %c",&p->c); }*/ //fwrite(ms, sizeof(MyStruct), 4, fp); //最后写到二进制文件 //直接输入 以ctrl+D 结束输入 while(scanf(" %d %s %c ", &ms.a, ms.b, &ms.c)) //while(scanf(" %d", &ms.a) && scanf(" %s ", ms.b) && scanf(" %c ",&ms.c)) { //每次输入结束之后直接写入二进制文件 fwrite(&ms, sizeof(MyStruct), 1, fp); } fclose(fp); return 0; } 2.2.2 读文件

需要获取文件大小,否则只能自己主观设定数据长度。并不想C++读取二进制文件那样通过是否读到EOF来确定读取是否结束。

#include #include #include typedef struct MyStruct{ int a; char b[10]; char c; }MyStruct; int main() { fp = fopen("test.dat", "rb+");//读写打开一个二进制文件,允许读写数据。 if (!fp) exit(1);//写文件失败 fseek(fp, 0L, SEEK_END);//定位到文件尾 int len = ftell(fp); //获取到文件大小 字节数 rewind(fp);//文件指针复位 到文件头 /*读int数据*/ /*int buffer[100]; memset(buffer, 0, sizeof(buffer)); //数组初始化为0 fread(buffer, sizeof(int), 100, fp);//读取数据到buffer缓冲区中 //读取的时候只能都读出来 或者一次读一个数据 但还是需要知道数据总长度 for(int i = 0; i < len / sizeof(int); i++) printf("%d ", buffer[i]); printf("\n"); int j = 0; while(j < len/sizeof(int)) { fread(&buffer[j], sizeof(int), 1, fp); printf("%d \n",buffer[j]); j++; }*/ /*读结构体数据*/ int j = 0; MyStruct ms[100]; while( j


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3