C++之文件的读取和写入操作(文本文件和二进制文件)
Posted 你是小KS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++之文件的读取和写入操作(文本文件和二进制文件)相关的知识,希望对你有一定的参考价值。
1.声明
当前内容主要为本人学习和记录C++的文件写入和读取操作
主要包括
- 使用ifstream读取文本文件内容
- 使用ofstream向文本文件中写入内容
- 使用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++之文件的读取和写入操作(文本文件和二进制文件)的主要内容,如果未能解决你的问题,请参考以下文章