转载自:明天再见
原文链接:http://blog.youkuaiyun.com/mfcing/article/details/7332432
1、头文件介绍
#include <iostream>//标准输入输出流
#include <fstream>//派生自iostream,包括ifstream和ofstream
using namespace std;//都在名称空间std中,别忘了加上
2、打开文件
const char* fileName="1.txt";//要打开的文件名,可以使路径名,默认情况下是所建工程下
fstream类派生了两个类ifstream\ofstream
fstream f(fileName,参数二);
参数二有多种形式,这里只看主要用的几种:
ios_base::in//打开文件用于读
ios_base::out//打开文件用于写
ios_base::app//打开文件,用于追加(不覆盖原有文件,默认情况是覆盖)
ios_base::binary//以二进制方式打开文件,默认情况下是文本文件方式
例:
fstream i(fileName,ios_base::in|ios_base::out);//打开文件用于读写(既可读也可写)
ifstream in(fileName,ios_base::binary|ios_base::in);//以二进制方式打开文件用于读
ofstream out(fileName,ios_base::out|ios_base::app);//打开文件用于追加
3、由于派生自iostream,很多其他的方法和iostream一样
比如:seekg()\eof()\clear()……
4、一些文件操作的例子
读写二进制文件
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct plant
{
char name[20];
int age;
char num[10];
};
int _tmain(int argc, _TCHAR* argv[])
{
plant p;
p.name[20] = (char)"yao";
p.age = 21;
p.num[10] = (char)"0950420011";
ofstream pf("data.dat", ios_base::out | ios_base::app | ios_base::binary);
pf.write((char*)&p, sizeof(p));
pf.close();
ifstream in("data.dat", ios_base::in | ios_base::binary);
plant p1;
in.read((char*)&p1, sizeof(p1));
in.close();
cout << p1.age << endl << p1.name << endl << p1.num << endl;
return 0;
}
循环读取指定文件的指定行
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <time.h>
using namespace std;
const int MAX = 1024;
const int M = 40;
//======自定义函数判断输入是否为数字=======///
bool IsDigital(const string &str)
{
//int flag=0;//字符串中数字的个数
if (str == "")
return false;
const char* p = str.c_str();
int length = str.length();
for (int i = 0; i<length; i++, p++)
{
if ((*p <= '0') || (*p >= '9'))
return false;
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
char c;
do
{
fstream f;
cout << "请输入文件名称(注:先把你要打开的文件复制到本程序下,如:'file.txt')" << endl;
int flag = 0;
[cpp] view plaincopy
do
{
string str;
if (flag)
{
f.clear();
cout << "输入文件不存在,请重新输入:" << endl;
}
cin >> str;
const char* file = str.c_str();
//string text="";
f.open(file, ios_base::in | ios_base::out | ios_base::binary);
flag++;
} while (!f.is_open());
int lineCount = 1;//记录当前文件的总行数
int SumByte = 0;//记录文件的总大小
while (!f.eof())
{
char c;
c = f.get();
if (c == '\n')
lineCount++;
SumByte++;
}
f.clear();
float kb;
kb = (float)SumByte / 1024;
cout << "当前文件的字节数是:" << SumByte << " Bit" << endl;
cout << "当前文件的总大小是:" << kb << " KB" << endl;
cout << "当前文件的总行数是: " << lineCount << endl;
cout << "/*===================================================*/\n/*===================================================*/" << endl;
int line;
string str_line;
cout << "\n接下来请输入你要读取文件的行数:\n";
cin >> str_line;
while (!IsDigital(str_line))
{
cout << "输入格式不正确,请重新输入:\n";
cin >> str_line;
}
line = atoi(str_line.c_str());
cout << "当前的line值 :" << line << endl;
while ((line <= 0) || (line>lineCount))
{
cout << "输入数据有误(1--" << lineCount << "间),请重新输入:\n";
cin >> line;
}
cout << "你选择了输出第" << line << "行" << endl;
//line=cin.get();
//string strOut;//输出内容
cout << "/*===================================================*/\n/*===================================================*/" << endl;
int count = 0;
char ch;
f.seekg(0);//指向文件开始位置
for (int i = 1; i<line; i++)
{
/*do
{
//f.read((char*)&ch,sizeof ch);
ch=f.get();
count++;
}
while(ch!='\n');*/
while (f.read((char*)&ch, sizeof ch))
{
count++;
if (ch == '\n')
break;
}
}
cout << "输出count的值:" << endl;
cout << count << endl;
f.seekg(count);//跳转到所选行数的开头
cout << "/*===================================================*/\n" << endl;
cout << "\n接下来输出你所选择的行:\n";
cout << "/*===================================================*/\n" << endl;
char a;
while (f.read((char*)&a, sizeof a))
{
cout << a;
if (a == '\n')
break;
}
cout << "" << endl;
cout << "是否继续打开文件?是-选择y:否-按任意键结束(除y)" << endl;
cin >> c;
} while (c == 'y');
// char p;
//cin>>p;
return 0;
}
复制文件
#include <iostream>
#include <fstream>
using namespace std;
const char* file1 = "1.txt";
const char* file2 = "2.txt";
//把文件1的内容写到文件2的末尾
int _tmain(int argc, _TCHAR* argv[])
{
ifstream in(file1);//默认方式打开文件1进行读
ofstream out(file2, ios_base::out | ios_base::app);//打开文件2进行写入(app为追加)
out << in.rdbuf();//将文件1的内容输入到文件2的流中
in.close();//关闭文件流
out.close();
return 0;
}