ifstream -- 從已有的文件讀
ofstream -- 向文件寫內容
fstream - 打開文件供讀寫
文件打開模式:
ios::in 讀
ios::out 寫
ios::app 從文件末尾開始寫
ios::binary 二進制模式
ios::nocreate 打開一個文件時,如果文件不存在,不創建文件。
ios::noreplace 打開一個文件時,如果文件不存在,創建該文件
ios::trunc 打開一個文件,然後清空內容
ios::ate 打開一個文件時,將位置移動到文件尾
文件指針位置在c++中的用法:
ios::beg 文件頭
ios::end 文件尾
ios::cur 當前位置
例子:
file.seekg(0,ios::beg); //讓文件指針定位到文件開頭
file.seekg(0,ios::end); //讓文件指針定位到文件末尾
file.seekg(10,ios::cur); //讓文件指針從當前位置向文件末方向移動10個字節
file.seekg(-10,ios::cur); //讓文件指針從當前位置向文件開始方向移動10個字節
file.seekg(10,ios::beg); //讓文件指針定位到離文件開頭10個字節的位置
常用的錯誤判斷方法:
good() 如果文件打開成功
bad() 打開文件時發生錯誤
eof() 到達文件尾
實例:
一、寫入文件
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
ofstream in;
in.open("com.txt",ios::trunc); //ios::trunc表示在打開文件前將文件清空,由於是寫入,文件不存在則創建
int i;
char a='a';
for(i=1;i<=26;i++)//將26個數字及英文字母寫入文件
{
if(i<10)
{
in<<"0"<<i<<"\t"<<a<<"\n";
a++;
}
else
{
in<<i<<"\t"<<a<<"\n";
a++;
}
}
in.close();//關閉文件
}
打開com.txt,效果如下:
二、讀取文件
上面僅僅是將文本寫入文件,並沒有讀取出來。
以下爲讀取文件的一種方法:將文件每行內容存儲到字符串中,再輸出字符串
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
char buffer[256];
fstream out;
out.open("com.txt",ios::in);
cout<<"com.txt"<<" 的內容如下:"<<endl;
while(!out.eof())
{
out.getline(buffer,256,'\n');//getline(char *,int,char) 表示該行字符達到256個或遇到換行就結束
cout<<buffer<<endl;
}
out.close();
cin.get();//cin.get() 是用來讀取回車鍵的,如果沒這一行,輸出的結果一閃就消失了
}
逐個字符的讀取文件:
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
fstream in;
char c;
in.open("comn.txt",ios::in);
while(!in.eof())
{
in>>c;
cout<<c;
}
in.close();
cin.get();
}
這個方法讀取的文件,所有字符都一起顯示,不會分行。這裏字母z顯示兩次,是正常的,因爲在輸出文件最後一個字母z之後,又輸出了一次(可以仔細考慮程序代碼)。
讀取文件某一行內容:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int CountLines(char *filename)
{
ifstream ReadFile;
int n=0;
string tmp;
ReadFile.open(filename,ios::in);//ios::in 表示以只讀的方式讀取文件
if(ReadFile.fail())//文件打開失敗:返回0
{
return 0;
}
else//文件存在
{
while(getline(ReadFile,tmp))
{
n++;
}
return n;
}
ReadFile.close();
}
string ReadLine(char *filename,int line)
{
int lines,i=0;
string temp;
fstream file;
file.open(filename,ios::in);
lines=CountLines(filename);
if(line<=0)
{
return "Error 1: 行數錯誤,不能爲0或負數。";
}
if(file.fail())
{
return "Error 2: 文件不存在。";
}
if(line>lines)
{
return "Error 3: 行數超出文件長度。";
}
while(getline(file,temp)&&i<line-1)
{
i++;
}
file.close();
return temp;
}
void main()
{
int l;
char filename[256];
cout<<"請輸入文件名:"<<endl;
cin>>filename;
cout<<"\n請輸入要讀取的行數:"<<endl;
cin>>l;
cout<<ReadLine(filename,l);
cin.get();
cin.get();
}
很顯然,根據以上程序,利用循環,可以逐行讀取整個文件內容。
三、統計文件的行數
#include <iostream>
#include <fstream>
using namespace std;
int CountLines(char *filename)
{
ifstream ReadFile;
int n=0;
char line[512];
ReadFile.open(filename,ios::in);//ios::in 表示以只讀的方式讀取文件
if(ReadFile.fail())//文件打開失敗:返回0
{
return 0;
}
else//文件存在
{
while(!ReadFile.eof())
{
ReadFile.getline(line,512,'\n');
n++;
}
return n;
}
ReadFile.close();
}
void main()
{
cout<<"comn.txt的行數爲: "<<CountLines("comn.txt")<<endl;
cin.get();
}
以上程序的設計思路沒有問題,但在實際操作的時候會發現統計出的行數與實際不符,原因在於ReadFile.getline(line,512,'\n')這一句:當一行字符超過512或遇到回車之後,行數自動加1.如果換行符在新的一行,返回的結果會比實際多1;如果不在新的一行,返回結果與實際相符。可以修改如下:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int CountLines(char *filename)
{
ifstream ReadFile;
int n=0;
char line[512];
string temp;
ReadFile.open(filename,ios::in);//ios::in 表示以只讀的方式讀取文件
if(ReadFile.fail())//文件打開失敗:返回0
{
return 0;
}
else//文件存在
{
while(getline(ReadFile,temp))
{
n++;
}
return n;
}
ReadFile.close();
}
void main()
{
cout<<"comn.txt的行數爲: "<<CountLines("comn.txt")<<endl;
cin.get();
}
四、讀取文件數據到數組
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int CountLines(char *filename)//獲取文件的行數
{
ifstream ReadFile;
int n=0;
string temp;
ReadFile.open(filename,ios::in);//ios::in 表示以只讀的方式讀取文件
if(ReadFile.fail())//文件打開失敗:返回0
{
return 0;
}
else//文件存在,返回文件行數
{
while(getline(ReadFile,temp))
{
n++;
}
return n;
}
ReadFile.close();
}
void main()
{
ifstream file;
int LINES;
char filename[512];
cout<<"請輸入要打開的文件名:"<<endl;
cin>>filename;
file.open(filename,ios::in);
if(file.fail())
{
cout<<"文件不存在."<<endl;
file.close();
cin.get();
cin.get();
}
else//文件存在
{
LINES=CountLines(filename);
int *tc=new int[LINES];
char *t=new char[LINES];
int i=0;
while(!file.eof()) //讀取數據到數組
{
file>>tc[i];
file>>t[i];
i++;
}
file.close(); //關閉文件
for(i=0;i<LINES;i++)//輸出數組內容
cout<<tc[i]<<"\t"<<t[i]<<endl;
cin.get();
cin.get();
}
}