C++ 文本文件处理
文件流对象
- #include <iostream>
- #include <fstream>
- #include <string>
- std::ifstream:用于从文件中读取数据的输入文件流类
- std::ofstream:用于向文件中写入数据的输出文件流类
- std::fstream:同时具有读写功能的文件流类
打开文件
- std::ofstream outfile(finename)
- 判断是否打开
- outfile.is_open()
读取文件
- std::ifstream infile(filename)
- 判断是否打开
- outfile.is_open()
- std::getline(infile,line) 读取
- std::string line;
- read()函数
- write()函数
写入文件
- outfile << string << std::endl;
- 覆盖写操作
- 追加写操作
- std::ofstream appendFile("file.txt", std::ios::app);
- 截断写操作
- std::ofstream truncateFile("file.txt", std::ios::trunc);
关闭文件
- infile.close()
example 01
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ofstream outfile("example.txt");
if (outfile.is_open())
{
outfile << "This is an example file." << std::endl;
outfile.close();
}
else
{
std::cout << "Failed to open the file." << std::endl;
}
std::ifstream infile("example.txt");
if (infile.is_open())
{
std::string line;
while (std::getline(infile,line))
{
std::cout << line << std::endl;
}
infile.close();
}
else
{
std::cout << "Failed to open the file." << std::endl;
}
return 0;
}
example 02
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ofstream outfile("file.txt");
if (outfile.is_open())
{
outfile << "This is line 1." << std::endl;
outfile << "This is line 2." << std::endl;
outfile.close();
}
else
{
std::cerr << "Failed to open the file." << std::endl;
}
std::ofstream appendFile("file.txt", std::ios::app);
if (appendFile.is_open())
{
appendFile << "This is a new line 3." << std::endl;
appendFile.close();
}
else
{
std::cerr << "Failed to open the file." << std::endl;
}
std::ofstream truncateFile("file.txt", std::ios::trunc);
if (truncateFile.is_open())
{
truncateFile << "This is a truncated line 4." << std::endl;
truncateFile.close();
}
else
{
std::cerr << "Failed to open the file." << std::endl;
}
std::ifstream infile("file.txt");
if (infile.is_open())
{
std::string line;
while (std::getline(infile, line))
{
std::cout << line << std::endl;
}
infile.close();
}
else
{
std::cerr << "Failed to open the file." << std::endl;
}
return 0;
}
文件指针
- 文件指针是一个用于指示文件位置的特殊指针。它可以用于在文件中定位、读取和写入数据。
- seekg() 和 seekp() 这两个函数用于设置输入和输出文件指针的位置.
- seekg()用于设置输入文件指针的位置
- seekp()用于设置输出文件指针的位置。
- tellg()和tellp() : 这两个函数用于获取输入和输出文件指针的当前位置
- tellg()返回输入文件指针的当前位置(从1开始)
- tellp()返回输出文件指针的当前位置。
- eof() : 这个函数用于检测文件是否已经到达末尾(End of File)
- 当文件指针指向文件末尾时,eof()函数返回true,否则返回false。
- good() : 这个函数用于检测文件的状态是否良好。
- 当文件状态正常时,good()函数返回true,否则返回false。
#include <iostream>
#include <fstream>
int main()
{
std::ofstream outfile("file.txt");
if (outfile.is_open())
{
outfile << "Hello, World!" << std::endl;
outfile.close();
}
else
{
std::cerr << "Failed to open the file." << std::endl;
return 1;
}
std::ifstream infile("file.txt");
if (infile.is_open())
{
char ch;
infile.seekg(7);
infile.get(ch);
std::cout << "Character at position 8 is: " << ch << std::endl;
std::cout << "tellq(): " << infile.tellg() << std::endl;
infile.seekg(0, std::ios::end);
std::streampos fileSize = infile.tellg();
std::cout << "File size: " << fileSize << " characters" << std::endl;
std::cout << "tellq(): " << infile.tellg() << std::endl;
infile.close();
}
else
{
std::cerr << "Failed to open the file." << std::endl;
return 1;
}
return 0;
}
错误处理
- 文件不存在
- 文件权限不足
- 文件格式错误
康摩搜先生升职记
我有一友,姓康名摩搜,住在八千里之外。此人脾气甚是古怪,常人难以捉摸。即使是我,也只能偶尔几次从他的面目表情中窥出一二。几日前,康摩搜先生高升,请我为他参谋,编织一份“同事眼中的某某某”来糊弄各色人等。现将此文公之于众。
天生万物而不同,山川风貌,土地人情,世间各异。我东洲乐土,自然是提倡人望高处的。而康先生生活的地方,正巧相反,是倡导学习了水之习性,望低处的。如果有一天,康先生能从山中醒来,用一整天溜达下去,傍晚在山脚安寝,他会乐疯了的。
然而康先生虽然追求水之风骨,可惜康先生毕竟是肉体凡胎,也有不少尽人志不能成之事。比如说,康先生无论如何也不能选择他将从多高的海拔上醒来。
水不激则不动,一个把向下若水作为追求的族群,是不会舍低求高的。然而,天不能随人愿,康先生们安寝之后,突然就会有一股神力,将他们抛向空中。高山有脊,仿若人手,接住了也就是接住了,绝不会轻易把康先生们漏下。
康先生有记日记的习惯,我特摘录几篇如下:
3月1号
今天开了个好头,昨天被抛得不算太高。
3月2号
今天开了个好头,昨天被抛得比前天低一些。
3月3号
今天开了个好头,昨天被抛得比大前天低一些。
3月10号
今日就糟了大糕。昨天被抛得太高,都到了30区了。
所谓“区”的概念,这里必定是要介绍的:好奇刻苦,善于钻研之人,想必哪个群类之中都有二一。曾经康先生一族之中,出了个颇有实力的数学家,他将康先生们醒来的地方于图上逐一标记,从低到高划分出自负五到一百共105个区。
康先生们早上醒来,先看看身在哪个区位。数字俞高,人俞沮丧。
3月11日
今日虽然也挺糟糕,但是还是略好于昨日的,醒来在29区。
3月12日
今日虽然也不甚理想,但也好于昨日的,醒来在22区。
3月13日
今日虽然也不甚理想,但也好于昨日的,醒来在10区。
3月14日
今日虽然也不甚理想,但看来是在一路向好的,醒来在2区了。
3月15日
今日大抵是守得云开见月明了,已经是负一区了。
15日之后,康先生就再没去过正数区。在负数区闲散了三个月,就荣升去也。