简单文件读写操作
类和引用说明
fstream iostream两个类需要引用。
vs2012打开后,自动引入头文件stdafx.h。
#include "stdafx.h"
#include <iostream>
#include <fstream>
流作为一个载体,可以直接和文件进行交换,因此在流open后,对流的读写(用流输出<< 、流输入>>实现)就是对文件的读写操作啦。
fstream
ifstream ofstream是fstream的派生。fstream不直接提供默认的模式值,必须显示的写入提供模式。
ofstream的open()函数默认打开方式为写操作,如果文件不存在,则建立一个文件,否则清空文件。
ifstream的open()函数默认打开方式为读操作,如果文件不存在则出错。
open()函数实现功能与构造函数一样。
使用完成后需用close()函数切断文件和流的联系。
iostream
流输入运算符“>>”和流输出运算符“<<”。在对文件的操作中,可以通过对文件流对象和运算符“>>”和"<<“实现对文件的读写,如同用cin、cout和“>>”和”<<"对标准设备的读写一样。
读写操作:往文本里写和从文本里读
以下代码为向abc.txt内输入一行语句,并从def.txt文本中读出一行语句至屏幕。
使用ofstream的对象,o-output,是用于文件的输出操作。使用ifstream对象,i-input,是文件的输入操作。
即:input是从文本文件往内存里读数据,而output是从内存往文本文件里写数据。文本文件是“外”,内存是“内”。
在vs中,相对路径是项目同名文件夹下(和*.cpp,stadfx.h在一个文件夹下)。vs自己的工程文件有一个大的文件夹,大文件夹里有一个项目同名文件夹才是放着各种*.cpp、*.h文件的,也就是相对路径在的地方。如我的电脑中abc.txt的绝对路径为:E:\C++_programe\ConsoleApplication1\ConsoleApplication1\abc.txt
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//往abc.txt里写入一句话
//构造函数方法,打开文件,默认写操作方式
ofstream a("abc.txt");
if(a.fail()){
cout << "打开文件失败" << endl;
exit(1);
}
//向a中输入一行语句
a << "Hello World!" << endl;
//关闭文件,即切断文件和流的联系
a.close();
//从def.txt读出并输出至屏幕
ifstream b;
b.open("def.txt");
if(b.fail()){
cout << "fail" << endl;
exit(2);
}
//x承接,从def.txt里读出的字符放到x中,再从x中取出,输出到屏幕
char x;
//EOF文件结束符.
//函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。
while (!b.eof())
{
b >> x;
cout << x;
}
cout << endl;
b.close();
return 0;
}
运行结果:
说明:屏幕输出内容不会对txt文本中的空格和换行符输出,这是因为ifstream类对象在使用>>时会跳过空格,直接读取空格后的内容。
如果是按行读取,需要添加string引用。下面为按行读取string的代码。
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
string str1,str2;
ofstream output("abc.txt");//打开文件
//打开文件以后要写一个异常处理
if(!output){
cout << "打开失败" ;
return -1;
}
str1="床前明月光,疑是地上霜";
output << str1;
output.close();
ifstream input("abc.txt");
input >> str2;
cout << str2 << endl;
input.close();
return 0;
}
运行结果:abc.txt中有“床前明月光,疑是地上霜”语句,屏幕输出“床前明月光,疑是地上霜”语句。