C++之文件的读取和写入操作(文本文件和二进制文件)

Posted 你是小KS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++之文件的读取和写入操作(文本文件和二进制文件)相关的知识,希望对你有一定的参考价值。

1.声明

当前内容主要为本人学习和记录C++的文件写入和读取操作

主要包括

  1. 使用ifstream读取文本文件内容
  2. 使用ofstream向文本文件中写入内容
  3. 使用ifstream和ofstream执行二进制文件复制操作

当前内容参考:C++中的io标准库

2.文本文件写入demo(会因为空格而隔断)

/*
 * FileWriteTxtTest.cpp
 *
 *  Created on: 2021年5月3日
 *      Author: hy
 *	当前内容主要为测试和使用C++来向abc.txt文件中写入数据操作
 */
#include<iostream>
#include<fstream>
#include<string>

using namespace std;

int main(int argc, char **argv) {
	string line;
	char data[100];
	const char* fileNamePath = "src/io/abc.txt";
	ofstream onfile;
	onfile.open(fileNamePath); //采用默认模式,默认会清空文件内容然后再写入数据
	//onfile.open(fileNamePath,ios::app);//采用追加模式写入
	//	判断文件是否打开失败
	if (onfile.fail()) {
		cout << "打开文件失败,当前文件" << fileNamePath << ",不存在" << endl;
	} else {
		string msg = "请输入一行数据到当前的文件中!";

		cout << msg << endl;
		cin >> data;
		cout << "写入数据到abc.txt中:" << data << endl;
		onfile << data; // 这个如果有空格,会被截断
		/*
		 cin >> line;
		 cout << "写入数据到abc.txt中:" << line << endl;
		 onfile << line; //	这里发现一个问题,空格被间隔开了无法输入
		 */

	}
	onfile.close();
}

测试结果
在这里插入图片描述
在这里插入图片描述
发现输入中的空格之后的内容被截断了,这又证明了\\0就是截断的字符

3.写入一行数据到文本中(不会因为空格而隔断)

//	不会因为空格截断
void write_line() {
	string line;
	const char* fileNamePath = "src/io/abc.txt";
	ofstream onfile;
	onfile.open(fileNamePath); //	采用默认模式,默认会清空文件内容然后再写入数据
	//onfile.open(fileNamePath,ios::app);//采用追加模式写入
	//	判断文件是否打开失败
	if (onfile.fail()) {
		cout << "打开文件失败,当前文件" << fileNamePath << ",不存在" << endl;
	} else {
		string msg = "请输入一行数据到当前的文件中!";
		cout << msg << endl;
		getline(cin, line);
		cout << "写入数据到abc.txt中:" << line << endl;
		onfile << line << "\\n";
	}
	onfile.close();
}

在这里插入图片描述

4.读取文本文件的demo(无法读取带有空格的行)

/*
 * FileReadTest.cpp
 *
 *  Created on: 2021年5月3日
 *      Author: hy
 *	当前内容主要为测试和使用C++来读取abc.txt文件操作
 */
#include<iostream>
#include<fstream>
#include<string>

using namespace std;

int main(int argc, char **argv) {
	string line;
	//char data[100];
	const char* fileNamePath = "src/io/abc.txt";
	ifstream infile;
	infile.open(fileNamePath);
	if (infile.fail()) {
		cout << "文件" << fileNamePath << "打开失败或者不存在!" << endl;
	} else {
		while(infile >> line){
			cout << "读取到数据:" << line << endl;
		}


		/*infile >> data;
		cout << "读取到数据:" << data << endl;
		infile >> data;
		cout << "读取到数据:" << data << endl;
		infile >> data;
		cout << "读取到数据:" << data << endl;
		infile >> data;

		cout << "读取到数据:" << data << endl;*/
	}

	infile.close();
}

执行结果
在这里插入图片描述

直接使用while方式读取即可,可以读取到文件的末尾,如果手动的读取可能到了末尾也不知道,还是输出最后一行字符

5.按行读取文本内容(不会应为空格而截断)

void read_file_using_line() {
	string line;
	//char data[100];
	const char* fileNamePath = "src/io/abc.txt";
	ifstream infile;
	infile.open(fileNamePath);
	if (infile.fail()) {
		cout << "文件" << fileNamePath << "打开失败或者不存在!" << endl;
	} else {
		while (getline(infile, line)) {
			cout << "读取到数据:" << line << endl;
		}
	}

	infile.close();
}

主要采取getline函数和string
在这里插入图片描述

6.执行复制二进制文件的demo

/*
 * FileTxtCopyTest.cpp
 *
 *  Created on: 2021年5月4日
 *      Author: hy
 *	当前内容主要为测试和使用C++中的文本拷贝(解决二进制文件的读取操作文件复制)
 */

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

int main(int argc, char **argv) {
	ifstream is; // 输入流
	ofstream os; // 输出流

	string isFilePath = "src/io/mybtais_lombok_generator.jar";  // 读取的文件位置
	string osFilePath = "src/io/copy.jar"; // 写入文件的位置

	//	定义一个buffer缓冲区
	int bufferSize = 1024;
	char* buffer = new char[bufferSize];
	// 1. 开始打开文件
	is.open(isFilePath, std::ios::binary); // 以二进制方式打开文件
	if (is.fail()) {
		cout << "打开读取的文件" << isFilePath << "失败!,请检查文件的路径是否存在该文件!" << endl;
		return 0;
	}
	//	2. 开始打开写入文件
	os.open(osFilePath, std::ios::binary);

	//	2. 开始读写文件
	while (is) {
		is.read(buffer, bufferSize);
		os.write(buffer, bufferSize);
	}

	cout << "执行复制文件成功!" << endl;

	delete[] buffer; // 删除buffer
	//	3. 顺序方式关闭当前的流
	is.close();
	os.close();

}

需要注意的是,打开方式和写入方式都是std::ios::binary,否则按照不是二进制文件读写,可以使用缓冲区,定义为new char[1024],采用read和write方式进行写入操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
采用错误的方式导致复制的文件大小与原来的不一致

7.总结

1.ifstream就是一个文件输入流,主要用于将文件中的内容读取到计算机中(input fstream)

2.ofstream就是一个文件输出轮流,主要用于将计算机中的内容写入到文件中

3.写入和读取都是通过open方式操作,写入的时候通过不同的模式来执行不同的操作,通过fail方法检测打开文件成功或者失败

4.C++中采用运算符重载的方式将>>和<<可以实现对文件的操作!

5.C++中操作二进制文件读写需要设定模式采用read和write和缓冲区方式进行读写

6.C++中可以使用new char[1024]方,通过delete point方式删除一个指针

7.C++中按行读取需要使用getline方法和string一起,可以实现按行读取

以上是关于C++之文件的读取和写入操作(文本文件和二进制文件)的主要内容,如果未能解决你的问题,请参考以下文章

C++文件读写操作逐字符读取文本和逐行读取文本

用C++写的二进制文件,用JAVA怎么读取?

用C++写的二进制文件,用JAVA怎么读取?

C++怎么把文件按照16进制进行读写?

Python文件操作:文件的打开关闭读取写入

如何读取和写入非固定长度的结构到二进制文件c++