C++ 簡單讀寫文本文件、統計文件的行數、讀取文件數據到數組

 
fstream提供了三個類,用來實現c++對文件的操作。(文件的創建、讀、寫)。
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();
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章