C++中fstream的使用

C++中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。作为派生的类,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。可将文件<fstream> 包括进来以使用任何fstream。如果只执行输入,使用ifstream类;如果只执行输出,使用 ofstream类;如果要对流执行输入和输出,使用fstream类。可以将文件名称用作构造函数参数。

ofstream: Stream class to write on files.

ifstream: Stream class to read from files.

fstream: Stream class to both read and write from/to files.

These classes are derived directly or indirectly from the classes istream and ostream.

对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。

要通过一个流对象打开一个文件,可以使用它的成员函数open()或直接通过构造函数。

void open (constchar * filename, openmode mode);

这里filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合:

ios::in  以输入(读)方式打开文件;

ios::out  以输出(写)方式打开文件;

ios::ate  初始位置:文件尾,文件打开后定位到文件尾;

ios::app  以追加的方式打开文件,所有输出附加在文件末尾;

ios::trunc  如果文件已存在则先删除该文件;

ios::binary  二进制方式,以二进制方式打开文件;

这些标识符可以被组合使用,中间以”或”操作符(|)间隔。

这些类的成员函数open 都包含了一个默认打开文件的方式,只有当函数被调用时没有声明方式参数的情况下,默认值才会被采用。如果函数被调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。ofstream类的默认打开方式是: ios::out | ios::trunc ;ifstream 类的默认打开方式是ios::in;fstream类的默认打开方式是: ios::in | ios::out.

        http://www.cplusplus.com/reference/fstream/fstream/中列出了fstream中可以使用的成员函数。

         C++ IO heads, templates and class (https://www.ntu.edu.sg/home/ehchua/programming/cpp/cp10_IO.html):


以下是测试代码:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <vector>

#include "fstream.hpp"

/* reference: 
	http://www.tutorialspoint.com/cplusplus/cpp_files_streams.htm
	https://www.ntu.edu.sg/home/ehchua/programming/cpp/cp10_IO.html
	http://www.bogotobogo.com/cplusplus/fstream_input_output.php
*/

int test_file_size()
{
	std::ifstream in("E:/GitCode/Messy_Test/testdata/fstream_data.bin", std::ios::binary);
	if (!in.is_open()) {
		std::cout << "fail to open file\n";
		return -1;
	}

	std::streampos begin, end;
	begin = in.tellg();
	in.seekg(0, std::ios::end);
	end = in.tellg();

	in.close();

	std::cout << "this file's size is: " << (end - begin) << " bytes.\n";

	return 0;
}

int test_fstream1()
{
	char data[100];

	// open a file in write mode.
	std::ofstream outfile;
	outfile.open("E:/GitCode/Messy_Test/testdata/fstream.dat");
	if (!outfile.is_open()) {
		std::cout << "fail to open file to write\n";
		return -1;
	}

	std::cout << "Writing to the file" << std::endl;
	std::cout << "Enter your name: ";
	std::cin.getline(data, 100);

	// write inputted data into the file.
	outfile << data << std::endl;

	std::cout << "Enter your age: ";
	std::cin >> data;
	std::cin.ignore();

	// again write inputted data into the file.
	outfile << data << std::endl;

	// close the opened file.
	outfile.close();

	// open a file in read mode.
	std::ifstream infile;
	infile.open("E:/GitCode/Messy_Test/testdata/fstream.dat");
	if (!infile.is_open()) {
		std::cout << "fail to open file to read\n";
		return -1;
	}

	std::cout << "Reading from the file" << std::endl;
	infile >> data;

	// write the data at the screen.
	std::cout << data << std::endl;

	// again read the data from the file and display it.
	infile >> data;
	std::cout << data << std::endl;

	// close the opened file.
	infile.close();

	return 0;
}

int test_fstream2()
{
	/* Testing Simple File IO (TestSimpleFileIO.cpp) */
	std::string filename = "E:/GitCode/Messy_Test/testdata/test.txt";

	// Write to File
	std::ofstream fout(filename.c_str());  // default mode is ios::out | ios::trunc
	if (!fout) {
		std::cerr << "error: open file for output failed!" << std::endl;
		abort();  // in <cstdlib> header
	}
	fout << "apple" << std::endl;
	fout << "orange" << std::endl;
	fout << "banana" << std::endl;
	fout.close();

	// Read from file
	std::ifstream fin(filename.c_str());  // default mode ios::in
	if (!fin) {
		std::cerr << "error: open file for input failed!" << std::endl;
		abort();
	}
	char ch;
	while (fin.get(ch)) {  // till end-of-file
		std::cout << ch;
	}
	fin.close();
	return 0;
}

int test_fstream3()
{
	/* Testing Binary File IO (TestBinaryFileIO.cpp) */
	std::string filename = "E:/GitCode/Messy_Test/testdata/test.bin";

	// Write to File
	std::ofstream fout(filename.c_str(), std::ios::out | std::ios::binary);
	if (!fout.is_open()) {
		std::cerr << "error: open file for output failed!" << std::endl;
		abort();
	}
	int i = 1234;
	double d = 12.34;
	fout.write((char *)&i, sizeof(int));
	fout.write((char *)&d, sizeof(double));
	fout.close();

	// Read from file
	std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary);
	if (!fin.is_open()) {
		std::cerr << "error: open file for input failed!" << std::endl;
		abort();
	}
	int i_in;
	double d_in;
	fin.read((char *)&i_in, sizeof(int));
	std::cout << i_in << std::endl;
	fin.read((char *)&d_in, sizeof(double));
	std::cout << d_in << std::endl;
	fin.close();

	return 0;
}

int test_fstream4()
{
	std::string theNames = "Edsger Dijkstra: Made advances in algorithms, the semaphore (programming).\n";
	theNames.append("Donald Knuth: Wrote The Art of Computer Programming and created TeX.\n");
	theNames.append("Leslie Lamport: Formulated algorithms in distributed systems (e.g. the bakery algorithm).\n");
	theNames.append("Stephen Cook: Formalized the notion of NP-completeness.\n");

	std::ofstream ofs("E:/GitCode/Messy_Test/testdata/theNames.txt");
	if (!ofs)	{
		std::cout << "Error opening file for output" << std::endl;
		return -1;
	}
	ofs << theNames << std::endl;
	ofs.close();

	char letter;
	int i;
	std::string line;

	std::ifstream reader("E:/GitCode/Messy_Test/testdata/theNames.txt");

	if (!reader) {
		std::cout << "Error opening input file" << std::endl;
		return -1;
	}

	//for (i = 0; !reader.eof(); i++) {
	while (!reader.eof()) {
		reader.get(letter);
		std::cout << letter;

		//getline( reader , line ) ;
		//std::cout << line << std::endl;
	}

	reader.close();

	return 0;
}

//
std::ofstream _file;

int test_init_database()
{
	_file.open("E:/GitCode/Messy_Test/testdata/data.bin");
	if (!_file.is_open()) {
		fprintf(stderr, "open file fail\n");
		return -1;
	}

	return 0;
}

int test_store_database()
{
	for (int i = 0; i < 10; ++i) {
		_file.write((char*)&i, sizeof(i));
	}

	return 0;
}

int test_close_database()
{
	_file.close();
	return 0;
}

int test_fstream5()
{
	test_init_database();

	for (int i = 0; i < 5; ++i) {
		test_store_database();
	}

	test_close_database();

	std::ifstream file("E:/GitCode/Messy_Test/testdata/data.bin");
	if (!file.is_open()) {
		fprintf(stderr, "open file fail\n");
		return -1;
	}

	int a[100];
	for (int i = 0; i < 50; ++i) {
		file.read((char*)&a[i], sizeof(int));
	}

	file.close();

	return 0;
}

//
static void parse_string(char* line, std::string& image_name, std::vector<int>& rect)
{
	std::string str(line);
	rect.resize(0);

	int pos = str.find_first_of(" ");
	image_name = str.substr(0, pos);
	std::string str1 = str.substr(pos + 1, str.length());
	for (int i = 0; i < 4; ++i) {
		pos = str1.find_first_of(" ");
		std::string x = str1.substr(0, pos);
		str1 = str1.erase(0, pos+1);
		rect.push_back(std::stoi(x));
	}
}

int test_fstream6()
{
	std::string name{ "E:/GitCode/Messy_Test/testdata/list.txt" };
	std::ifstream in(name.c_str(), std::ios::in);
	if (!in.is_open()) {
		fprintf(stderr, "open file fail: %s\n", name.c_str());
		return -1;
	}

	int count{ 0 };
	char line[256];
	in.getline(line, 256);
	count = atoi(line);
	std::cout << count << std::endl;
	//while (!in.eof()) {
	for (int i = 0; i < count; ++i) {
		in.getline(line, 256);
		std::cout << "line: "<< line << std::endl;
		std::string image_name{};
		std::vector<int> rect{};
		parse_string(line, image_name, rect);
		std::cout << "image name: " << image_name << std::endl;
		for (auto x : rect)
			std::cout << "  " << x << "  ";
		std::cout << std::endl;
	}

	in.close();
	return 0;
}

//
int test_fstream7()
{
	std::string name{ "E:/GitCode/Messy_Test/testdata/list.txt" };
	std::ifstream in(name.c_str(), std::ios::in);
	if (!in.is_open()) {
		fprintf(stderr, "open file fail: %s\n", name.c_str());
		return -1;
	}

	int count{ 0 };
	std::string image_name{};
	int left{ 0 }, top{ 0 }, right{ 0 }, bottom{ 0 };
	in >> count;
	std::cout << "count: " << count << std::endl;
	for (int i = 0; i < count; ++i) {
		in >> image_name >> left >> top >> right >> bottom;
		fprintf(stdout, "image_name: %s, rect: %d, %d, %d, %d\n", image_name.c_str(), left, top, right, bottom);
	}

	in.close();
	return 0;
}


GitHubhttps://github.com/fengbingchun/Messy_Test

  • 20
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值