C++简单写入文本文件和读取文本文件

  • 写入文本文件    

  使用文件输出的主要步骤如下:  
         1.包含头文件fstream 。
         2.创建一个ofstream 对象。
         3.将该ofstream 对象同一个文件关联起来。
         4.就像使用cout 那样使用该ofstrcam 对象。

#include 
#include 
using namespace std;
int main() {
	//调用ofstream类创建myout对象
	ofstream myout("C:/Users/Administrator/Desktop/test/test.txt", ios::in | ios::out | ios::app);     
	/*ofstream myout("test.txt");*/		//这样是默认生成在当前程序文件夹内
	
	//打开文件后可以执行写入操作
	for (int i = 1; i <= 5; i++) {
		myout << "number: " << i << endl;
	}

	/*is_open检测文件是否被程序打开*/
	if (myout.is_open()) {
		myout << "is opened,out from myout" << endl;

		/*在屏幕上输入,输出到文件*/
		string Char;
		cin >> Char;                   
		myout << "从键盘输入并存到文件的是: " << Char << endl;
	}
	myout.close();
	
	//在这之前已经执行close(),下面这行不能输入到文本。如果想写入就需要重新打开文本。myout.open()
	myout << "cant out" << endl;
	
	cout << "over" << endl;
	return 0;
}

(1)open()

上面对象myout使用的open()方法,默认情况下,open()将首先截断该文件即将其长度截短到零——丢其原有的内容,然后将新的输出加入到该文件中:

ofstream myout;
myout.open("C:/Users/Administrator/Desktop/test/test.txt");

(2)想要自定义打开文本的方式,可以添加:
            
- ios::in           为输入(读)而打开文件     
- ios::out         为输出(写)而打开文件     
- ios::ate         初始位置:文件尾
- ios::app        所有输出附加在文件末尾     
- ios::trunc      如果文件已存在则先删除该文件     
- ios::binary    二进制方式
    
    例如:

 myout.open("C:/Users/Administrator/Desktop/test/test.txt", ios::in | ios::out | ios::app);            //以读写,并把输出附加在文件末尾的方式打开文本文件。


(3)close()

当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问的。成员函数close(),它负责将缓存中的数据排放出来并关闭文件。这个函数一旦被调用,原先的流对象就可以被用来打开其它的文件了,这个文件也就可以重新被其它的进程所访问了。
        如果忘记关闭文件,程序正常终止时将自动关闭它。方法close()不需要使用文件名作为参数,这是因为对象myout 已经同特定的文件关联起来。为防止流对象被销毁时还联系着打开的文件,析构函数将会自动调用关闭函数close。

  •  读取文本文件

 使用文件读取的主要步骤如下:
         1.包含头文件fstream 。
         2.创建一个ifstream 对象。
         3.将该ifstream 对象同一个文件关联起来。
         4.就像使用cin 那样使用该ifstrcam 对象。

/*C++primer plus 6.16sumafile*/

#include 
#include           // file I/O support
#include           // support for exit()
#include 
#include 

const int SIZE = 60;
int main() {
	using namespace std;

	ofstream myout("C:/Users/Administrator/Desktop/test/test.txt", ios::in | ios::out | ios::app);
	int number[10] = { 0 };
	srand((unsigned)time(NULL)); //播种子
	for (int i = 0; i < 10; i++) {
		number[i] = rand() % 100; //产生100以内的随机整数,不包括100。
		//number[i] = rand() % (200 - 100 + 1) + 100;      //int num=rand()%(n-m+1)+m  产生 [m,n] 范围内的随机数 num
		myout << number[i] <<" ";
	}
	myout.close();

	char filename[SIZE];
	ifstream inFile;        // 创建处理文件输入的对象
	cout << "Enter name of data file: ";
	cin.getline(filename, SIZE);
	string File = "C:/Users/Administrator/Desktop/test/";     //为了方便,我在这里定了一个文件夹
	File = File + filename;
	inFile.open(File);  // 将inFile与文件关联
	if (!inFile.is_open())  // 打开文件失败
	{
		cout << "Could not open the file " << filename << endl;
		cout << "Program terminating.\n";
		// cin.get();    // keep window open
		exit(EXIT_FAILURE);		//函数exit()的原型是在头文件cstdlib中定义的,在该头文件中,还定义了一个用于同操作系统通信的参数值EXIT_FAILURE。函数exit()终止程序。
	}
	double value;
	double sum = 0.0;
	int count = 0;          // 累计项目数

	inFile >> value;        // 读取第一个值
	while (inFile.good())   // 较老的方法good(),或者使用!eof()
	//while(inFile>>value)    //如果用这行替换上面两行,会导致只能读取到第一个回车符号后就结束读取。使用方法读取能获取到文件末尾。
	{
		++count;            // one more item read
		sum += value;       // 累加所有值
		inFile >> value;    // 获取下一个值
	}
	if (inFile.eof())		//读取到文件末尾
		cout << "End of file reached.\n";
	else if (inFile.fail())			//读取格式错误。例如读取到一个不符合上面double类型的字符,返回true
		cout << "Input terminated by data mismatch.\n";
	else
		cout << "Input terminated for unknown reason.\n";
	if (count == 0)		//如果没有符合的数据类型
		cout << "No data processed.\n";
	else {
		cout << "Items read: " << count << endl;
		cout << "Sum: " << sum << endl;
		cout << "Average: " << sum / count  << endl;
	}
	inFile.close();         // 关闭文件
	//cin.get();
	return 0;
}

(1)警告:

Windows 文本文件的每行都以回车字符和换行符结尾;通常情况下,C++在读取文件时将这两个字符转换为换行符,并在写入文件时执行相反的转换。有些文本编辑器(如Metrowerks CodeWarrior IDE编辑器),不会自动在最后一行末尾加上换行符。因此,如果使用的是这种编辑器,请在输入最后的文本后桉下回车键,然后再保存文件。
       Windows自带的记事本就不会在末尾加上换行符。这里可坑了我半天。

(2)生产10个随机整数数写入文本

ofstream myout("C:/Users/Administrator/Desktop/test/test.txt", ios::in | ios::out | ios::app);
	int number[10] = { 0 };
	srand((unsigned)time(NULL)); //播种子
	for (int i = 0; i < 10; i++) {
		number[i] = rand() % 100; //产生100以内的随机整数,不包括100。
		//number[i] = rand() % (200 - 100 + 1) + 100;      //int num=rand()%(n-m+1)+m  产生 [m,n] 范围内的随机数 num
		myout << number[i] <<" ";
	}
	myout.close();

(3)该程序没有使用硬编码文件名,而是将用户提供的文件名存储到字符数组filename 中,然后将该数组用作open( )的参数:
                inFile.open(File);

(5)如果想要读取文件内容打印到屏幕上,用下面代码可以实现:

/*读取文件的内容打印到屏幕上*/
	ifstream ifstream_in;
	ifstream_in.open("C:/Users/Administrator/Desktop/test/test.txt");   
 
    //声明自己的ifstream 对象,为其命名,并将其同文件关联起来。
	if (!ifstream_in.is_open()) {			//如果文件被成功地打开,方法is_open()将返回true。这里是打开文件失败。
		cout << "Error opening file";
        exit(1);
	}
	while (!ifstream_in.eof()) {
		char buffer[100];
		ifstream_in.getline(buffer, 100);		//读取文本的每行,将其打印到屏幕上。超过100字符不能打印
		cout << buffer << endl;
	}

	ifstream_in.close();

 

其中有很多方法没弄明白:exit(), good(), eof(), fail()......

你可能感兴趣的:(C++Primer,Plus练习,c++)