C++文件处理(一):读/写txt文件


C++文件处理与C语言不同,C++文件处理使用的是:流(stream)
C++头文件fstream定义了三个类型来支持文件IO👇

  • ifstream从一个给定文件中读取数据
  • ofstream向一个给定文件写入数据
  • fstream可以读写文件

这些类型提供的操作与我们之前已经使用过的cincout操作一样。特别是,我们可以使用IO运算符(>>和<<)来读写文件,也可使用getline从一个ifstream中读取数据。

图1. fstream特有的操作(图片来源于参考[1])

一、读txt文件

现有cameras.txt文件,内容如下👇
读取txt文件,并逐行打印

# Camera list with one line of data per camera:
#   CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# Number of cameras: 1
0 PINHOLE 6220 4141 3430.27 3429.23 3119.2 2057.75
// Author: Programmer ToddyQi
// Date: 2020-02-12
#include <iostream>
#include <fstream>    // 头文件 For both fstream and ifstream
#include <string>

using namespace std;

int main() {
	string path = "./cameras.txt";
	
	ifstream in_file(path, ios::in); //按照指定mode打开文件
	
	// is_open()函数返回一个bool值,指出与in_file关联的文件是否成功打开且未关闭
	if (in_file.is_open()) { // 或者if (in_file)
		cout << "Open File Successfully" << endl;
		string line;
		while(getline(in_file, line)) {
			cout << line << endl;
			}		
	} else {
		cout << "Cannot Open File: " << path << endl;
		getchar();
		return EXIT_FAILURE;
	}
	in_file.close(); // 关闭与in_file绑定的文件,返回void
	
	getchar();
	return EXIT_SUCCESS;
}

图2. 实验运行结果

二、写txt文件

main()函数如下,main()函数之前的部分同上

int main()
{
	string path = "./log.txt";

	ofstream out_file(path, ios::out | ios::app); //按照指定mode打开文件
	// ofstream out_file(path, ios::out);

	if (out_file.is_open()) {
		cout << "Open File Successfully" << endl;
		out_file << "Have a Nice Day!" << endl;	
	} else {
		cout << "Cannot Open File: " << path << endl;
		getchar();
		return EXIT_FAILURE;
	}
	out_file.close();

	getchar();
	return EXIT_SUCCESS;
}

图3. 实验运行结果
Code is Here: 点击查看详细内容 TODO

// 解析cameras.txt文件
void Reconstruction::ReadCamerasText(const std::string& path) {
  cameras_.clear();

std::ifstream file(path);
CHECK(file.is_open()) << path;

std::string line;
std::string item;

while (std::getline(file, line)) {
StringTrim(&line);

if (line.empty() || line[0] == '#') {
  continue;
}

std::stringstream line_stream(line);

class Camera camera;

// ID
std::getline(line_stream, item, ' ');
camera.SetCameraId(std::stoul(item));

// MODEL
std::getline(line_stream, item, ' ');
camera.SetModelIdFromName(item);

// WIDTH
std::getline(line_stream, item, ' ');
camera.SetWidth(std::stoll(item));

// HEIGHT
std::getline(line_stream, item, ' ');
camera.SetHeight(std::stoll(item));

// PARAMS
camera.Params().clear();
while (!line_stream.eof()) {
  std::getline(line_stream, item, ' ');
  camera.Params().push_back(std::stold(item));
}

CHECK(camera.VerifyParams());

cameras_.emplace(camera.CameraId(), camera);

}
}

参考


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM