对文件进行读取操作,需要包含fstream头文件:
一、打开一个供输出的文件
#include <fstream>
为了打开一个可供输出的文件,定义一个ofstream(供输出用的file stream)对象,并将文件名传入:
//以输出模式开启“D:\\001.txt”
ofdtream outfile("D:\\001.txt");
声明outfile的过程中:
1.如果指定的文件(D:\001.txt)不存在,会产生一个新文件并打开供输出使用。
2.如果指定的文件存在,这个文件会被打开并用于输出,文件中原有的数据会被丢弃。
如果不希望文件001txt中原有的数据被丢弃,而是希望将新数据增加在文件中,那么以追加模式打开这个文件。
为此,提供第二个参数给ofstream对象。ios_base::app
//以追加模式打开001.txt
//新数据会被追加在文件末尾
ofstream outfile("D:\\001.txt",ios_base::app);
二、打开一个供读取的文件
要打开一个供读取的文件,定义一个ifstream(供输入的file stream)对象,并将文件名传入:
//以读取模式打开infile
ifstream infile("D:\\001.txt");
三、根据一个练习题来实践(用到数组、vector、文件的读写)
练习1.7
使用你最称手的工具,输出两行(或更多)文字并存盘。然后编写一个程序,打开该文本文件,将其中每个字都读取到一个vector<string 。>对象中。遍历该vector,将内容显示到cout。然后利用泛型算法sort(),对所有文字排序:再将排序后的结果输出到另一个文件。
#include <algorithm>
sort(container.begin(),container.endl());
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>//泛型算法sort()需要的头文件
int main()
{
vector<string> user_names(5);//定义vector
int i = 0;//用作循环的计数
ifstream infile("D:\\001.txt");//打开可供读取的文件“001.txt"
if (!infile)
cout << "文件打开失败!" << endl;
else
{
string user_name;//用作记录读取到的字符串
while (infile >> user_name)//每次迭代都会读取文件的下一行内容。直到读取到文件末尾结束
{
user_names[i] = user_name;//逐个赋值到vector
i++;//索引
cout << user_name << endl;//逐个输出
}
cout << "\n\n";//两次换行排版
for (i = 0; i < user_names.size(); i++)//遍历vector输出
{
cout << "Calling vector once!\t";//提示vector响应
cout << user_names[i] << endl;
}
sort(user_names.begin(), user_names.end());//利用泛型算法sort()对5个字符串排序
for (i = 0; i < user_names.size(); i++)//循环遍历vector,输出排序后的5个字符串
{
cout << "Calling vector twice:\t";//提示vector响应第二次
cout << user_names[i] << endl;//输出排序后结果
}
ofstream outfile("D:\\change001.txt");//打开可供输出的文件“change001.txt".
//这里没有文件,outfile会创建一个新文件:“change001.txt"
if (!outfile)
cout << "文件打开失败!" << endl;
else
for (i = 0; i < user_names.size(); i++)//遍历5个字符串,逐个写入新文件
{
cout << "Calling ofstream!" << "\t";//提示响应
outfile << user_names[i] << endl;//写入操作
}
ifstream infile("D:\\change001.txt");//再次打开新文件查看
if (!infile)
cout << "文件打开失败!" << endl;
else
{
while (infile >> user_name)
cout << "文件读写成功!\t" << user_name<<endl;//逐个输出
}
}
return 0;
}
运行结果:
打开修改后的文件查看:
这里为了深刻的认ofstream,试着修改新产生的文件"change001.txt"
然后再次运行程序。看看新文件的旧值是否会被丢弃。
可以看到再次运行后,之前的内容被丢弃。每运行一次,新文件的时间戳都会被改变一次。这说明每一次都会舍弃之前的内容
再次修改程序:改用以 追加模式 打开新文件。然后运行程序:
为outfile新增一个参数 “ios_base::app”
运行结果:
可以看到,第一次执行程序所写入的字符串没有被舍弃