cpp►文件和流

Posted itzyjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cpp►文件和流相关的知识,希望对你有一定的参考价值。


我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。
从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型:

数据类型描述
ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream该数据类型表示输入文件流,用于从文件读取信息。
fstream该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

打开文件

open()函数是fstream、ifstream、ofstream对象的一个成员:

void open(const char *filename, ios::openmode mode);
模式标志描述
ios:app追加模式。所有写入都追加到文件末尾
ios::ate文件打开后定位到文件末尾。
ios::in打开文件用于读取。
ios::out打开文件用于写入。
ios::trunc如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。
ios::binary以二进制模式读写。

如果想以写入模式打开文件,并希望截断文件,以防止文件已存在:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc);

如果想打开一个文件用于读写:

ifstream afile;
afile.open("file.dat", ios::out | ios::in);
关闭文件

close()函数是fstream、ifstream、ofstream对象的一个成员。

void close();
写入文件

在 C++ 编程中,我们使用流插入运算符( << )向文件写入信息,就像使用该运算符输出信息到屏幕上一样。唯一不同的是,在这里您使用的是 ofstream 或 fstream 对象,而不是 cout 对象。

读取文件

在 C++ 编程中,我们使用流提取运算符( >> )从文件读取信息,就像使用该运算符从键盘输入信息一样。唯一不同的是,在这里您使用的是 ifstream 或 fstream 对象,而不是 cin 对象。

读写示例
#include <fstream>
#include <iostream>
using namespace std;
int main() {
	char data[100];

	ofstream outfile;// 以写模式打开文件
	outfile.open("afile.dat");

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

	outfile << data << endl;// 向文件写入用户输入的数据

	cout << "Enter your age: ";
	cin >> data;
	cin.ignore();// Skip over remaining newline

	outfile << data << endl;// 再次向文件写入用户输入的数据
	outfile.close();// 关闭打开的文件

	ifstream infile;// 以读模式打开文件
	infile.open("afile.dat");

	cout << "Reading from the file..." << endl;
	infile >> data;
	cout << data << endl;// 在屏幕上写入数据

	infile >> data;// 再次从文件读取数据,并显示它
	cout << data << endl;

	infile.close();// 关闭打开的文件
	return 0;
}

根目录下生成的afile.dat文件内容如下:

Writing to the file...
Enter your name: |Zara<Enter>
Enter your age: |9<Enter>
Reading from the file...
Zara
9

文件位置指针

istream 和 ostream 都提供了用于重新定位文件位置指针的成员函数。这些成员函数包括关于 istream 的 seekg(“seek get”)和关于 ostream 的 seekp(“seek put”)。
seekg 和 seekp 的参数通常是一个长整型。第二个参数可以用于指定查找方向。查找方向可以是 ios::beg(默认的,从流的开头开始定位),也可以是 ios::cur(从流的当前位置开始定位),也可以是 ios::end(从流的末尾开始定位)。

// 定位到 fileObject 的第 n 个字节(假设是 ios::beg)
fileObject.seekg(n);
 
// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg(n, ios::cur);
 
// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg(n, ios::end);
 
// 定位到 fileObject 的末尾
fileObject.seekg(0, ios::end);
// read a file into memory
#include <iostream>// std::cout
#include <fstream>// std::ifstream
int main() {
	std::ifstream is("afile.dat", std::ifstream::binary);
	if (is) {
		is.seekg(0, is.end);// get length of file
		int length = is.tellg();
		is.seekg(0, is.beg);

		char* buffer = new char[length];// allocate memory
		is.read(buffer, length);// read data as a block
		is.close();

		std::cout.write(buffer, length);// print content
		delete[] buffer;
	}
	return 0;
}
akuan
99

以上是关于cpp►文件和流的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp Atlas300代码片段

c_cpp Robolution基本代码片段

c_cpp 加载源图像固定用法(代码片段,不全)

Cpp:将字符串片段解析为元组

c_cpp 快速代码片段,用于在统计(阻止)/ dev / rdsk中的设备时验证fstat64和stat64的行为。

c_cpp 这个简单的代码片段显示了如何使用有符号整数在C中完成插值。 for()循环确定要插入的范围