CC++⽂件读写操作(⼆进制⽂件⽂本⽂件)
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⽂件指针的初始位置在⽂件尾。
fprintf作用1.1 C++操作⽂本⽂件
1.1.1 写⽂件
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
ofstream fout("",ios::out);//默认是ios::trunc
/*读⽂件*/
if(!fout.is_open())
{
exit(1);
}
char ch;
while(!(EOF==(ch =getchar())))//ctrl + z
{
fout << ch;
}
fout.close();
return0;
}
1.1.2 读⽂件
int main()
{
ifstream fin("in.txt",ios::in);//默认是ios::trunc
/*读⽂件*/
if(!fin.is_open())
{
exit(1);
}
char ch;
fin >> noskipws;//不跳过空格和回车
//默认跳过空格和回车
//读取单个字符
/*while(!f())
{
fin >> ch;
cout << ch;
}*/
//读取单个字符
/*while(!(EOF == (ch = ())))
{
cout << ch;
}*/
//读取⼀⾏字符串 getline
string str;
while(getline(fin, str))
{
cout << str <<"*"<<endl;
}
fin.close();
return0;
}
1.2 C++操作⼆进制⽂件
⼆进制⽂件⽐⽂本⽂件的好处是占⽤内存空间⼩,且便于检索。⽐如要存放结构体或者类时,⽂本⽂件存储的只是单纯的⽂本,不但浪费空间⽽且效率低下。因为在结构体或者类中每个对象的占⽤字节数不同,即使⽂本⽂件按照某个值排好序,只能从⽂件头向⽂件尾搜索,没有什么其他好办法。
但是⽤⼆进制来存储,每个结构体或者类占⽤的字节数都是相同的,直接将该对象写⼊⽂件,称作“记录”,每个对象对应⼀条记录,按照某个值排序之后可以⽤⽐如⼆分搜索等算法进⾏检索,这样就快了很多。
读写⼆进制⽂件不能⽤类似于cin cout之类的流数据读取⽅法,这时需要调⽤fstream和ofstream的成员函数write向⽂件中写⼊数据,fstream和ifstream的成员函数read从⽂件中读取数据。
1.2.1 写⽂件
ostream & write(char* buffer, int count);
class MyClass{
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();
return0;
}
1.2.2 读⽂件
istream & read(char* buffer, int count);
int gcount();
#include<iostream>
#include<fstream>
#include<string>
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;
ad((char*)&mc,sizeof(mc)))
{
int cnt_bytes = unt();//查看刚才读取了多少字节
cout << cnt_bytes<<endl;
cout << mc.a <<" "<<mc.b <<" "<< mc.c<<endl;
}
fin.close();
return0;
}
为什么在MyClass中b定义为string类型的变量,在读取out.dat⽂件的时候读不出来呢?
2. C⽂件读写操作
打开
模式
说明
r以只读⽅式打开⽂件,该⽂件必须存在。
r+以可读写⽅式打开⽂件,该⽂件必须存在。
rb+读写打开⼀个⼆进制⽂件,允许读写数据。
rw+读写打开⼀个⽂本⽂件,允许读和写。
w打开只写⽂件,若⽂件存在则⽂件长度清为0,即该⽂件内容会消失。若⽂件不存在则建⽴该⽂件。
w+打开可读写⽂件,若⽂件存在则⽂件长度清为零,即该⽂件内容会消失。若⽂件不存在则建⽴该⽂件。
a 以附加的⽅式打开只写⽂件。若⽂件不存在,则会建⽴该⽂件,如果⽂件存在,写⼊的数据会被加到⽂件尾,即⽂件原先的内容会被保留。(EOF
符保留)
a+以附加⽅式打开可读写的⽂件。若⽂件不存在,则会建⽴该⽂件,如果⽂件存在,写⼊的数据会被加到⽂件尾后,即⽂件原先的内容会被保留。
(原来的EOF符不保留)
wb只写打开或新建⼀个⼆进制⽂件;只允许写数据。wb+读写打开或建⽴⼀个⼆进制⽂件,允许读和写。
ab+读写打开⼀个⼆进制⽂件,允许读或在⽂件末追加数据。
at+打开⼀个叫string的⽂件,a表⽰append,就是说写⼊处理的时候是接着原来⽂件已有内容写⼊,不是从头写⼊覆盖掉,t表⽰打开⽂件的类型是⽂
本⽂件,+号表⽰对⽂件既可以读也可以写。
2.1 C操作⽂本⽂件
2.1.1 写⽂件
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp =fopen("","w");//只写⽅式打开⽂件
if(!fp)
exit(1);//写⽂件失败
int a;
while(scanf("%d",&a))
{
fprintf(fp,"%d ",a);
}
fclose(fp);
return0;
}
2.1.2 读⽂件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
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);
return0;
}
2.2 C操作⼆进制⽂件
2.2.1 写⽂件
此处要注意的就是在写结构体数据的时候,因为char c变量是字符,因此要注意要在每次输⼊结构体之后吃掉回车符,否则会导致输⼊失败,就像我在代码中写的那样,⽤空格来吃掉前⾯的空⽩字符(包括回车 空格等)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论