2023年5月30日,周二下午:
这几天学习了C++对文本文件的读写,写篇博客来总结一下
由于内容太多,我没法一次性写完,之后会不定期更新的
我使用C++标准库中的fstream库来读写文本文件
用fstream来读写文本文件有两种方式:
1、使用插入运算符“<<”和提取运算符“>>”
2、使用fstream库里面的类的成员函数
使用插入运算符“<<”和提取运算符“>>”来读写文本文件
通过"<<"往文本文件中写入数据:
注意:C语言风格的字符串和C++的string类都可以通过"<<"往文本文件中写入数据。
我个人建议使用C++的string类,因为这样就不用考虑设置长度或者说大小的问题。如果你用C语言风格的字符串的话,还要设置字符数组的大小,有点麻烦。
#include <iostream>
#include <fstream>
using namespace std;
int main(){
char cBuf[1024];
string sBuf;
ofstream ofs("text.txt",ios::out);
cin>>cBuf;
cin>>sBuf;
//C语言风格的字符串和C++的string类都可以
//通过"<<"往文本文件中写入数据
ofs<<cBuf;
ofs<<sBuf;
//往文本文件中写完数据后,要记得调用close来关闭
ofs.close();
return 0;
}
不过,这个程序或者说用“<<”往文本文件中写入数据有一个问题,那就是不能含空格,否则就会停止写入,即使空格后面还有内容
可以看到空格后面的内容没有写入
通过">>"从文本文件中读取数据:
注意:C语言风格的字符串和C++的string类都可以通过">>"从文本文件中读取数据。
我个人建议使用C++的string类,因为这样就不用考虑设置长度或者说大小的问题。如果你用C语言风格的字符串的话,还要设置字符数组的大小,有点麻烦。
假设文本文件text2.txt的内容如下:
中国专业IT社区CSDN(Chinese Software Developer Network)创立于1999年,致力于为中国软件开发者提供知识传播、在线学习、职业发展等全生命周期服务。
#include <iostream>
#include <fstream>
using namespace std;
int main(){
string sBuf;
//char cBuf[1024];
ifstream ifs("text2.txt",ios::in);
//把文本文件中的数据提取到sBuf中
ifs>>sBuf;
//把文本文件中的数据提取到C语言风格的字符串中也是可以的
//ifs>>cBuf;
//输出sBuf的内容
cout<<sBuf<<endl;
//cout<<cBuf<<endl;
ifs.close();
return 0;
}
怎么句子没读取完呢???咋读到一半没到就停了???
这是因为Chinese前面有一个空格,也就是说用">>"从文本文件中读取数据时,遇到空格就会停止读取,哪怕后面还有内容没有读取。
那我想读取完怎么办?
目前是没有办法的,
ifs>>sBuf这个语句每次只会读取文本文件中的一个单词(即空格或换行符分隔的一组字符),
即使是你加上循环也不能解决这个问题:
#include <iostream>
#include <fstream>
using namespace std;
int main(){
string sBuf;
//char cBuf[1024];
ifstream ifs("text2.txt",ios::in);
//把文本文件中的数据提取到sBuf中
ifs>>sBuf;
//把文本文件中的数据提取到C语言风格的字符串中也是可以的
//ifs>>cBuf;
while(!ifs.eof()){
//输出sBuf的内容
cout<<sBuf;
//cout<<cBuf<<endl;
ifs>>sBuf;
}
ifs.close();
return 0;
}
总而言之,虽然用>>和<<很方便,但是局限性也不少。
但是>>和<<也非一无是处,通过<<和换行符"\n"可以很方便的按行写入数据,再搭配getline按行读取函数,可以很容易实现一个通讯录小项目及其数据的存储和读取,并且还可以很容易实现按名或者手机号等查找、浏览通讯录、按名或者手机号等删除等功能。之后有空的话,我会完成这个小项目,可能写在本篇博客的最后,也可能新开一篇博客。
使用fstream库里面的类的成员函数来读写文本文件
这部分内容还没写完,有空会更新的