1. 程式人生 > >c++讀取文本文件的一個極其容易忽略的空行問題

c++讀取文本文件的一個極其容易忽略的空行問題

lac 文件內容 close urn 文本 原創 知識庫 nts report

C++用fstream打開文件之後,讀一次文件後,再次讀該文件卻怎樣也不能將文件的指針置到開頭?

技術分享分類: #include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
class Copy_file{
public:
Copy_file();
~Copy_file();
void Copy_files();
void in_file();
void out_file();
private:
fstream inf;
fstream outf;
char file1[20];
char file2[20];
};
Copy_file::Copy_file(){
cout<<"請輸入源文件名";
cin>>file1;
inf.open(file1,ios::in|ios::binary);
if(!inf){
cout<<"不能打開文件"<<endl;
abort();
}
cout<<"請輸入目的文件名字";
cin>>file2;
outf.open(file2,ios::in|ios::out|ios::binary);
if(!outf){
cout<<"不能打開目的文件";
abort();
}
}
Copy_file::~Copy_file(){
inf.close();
outf.close();
}
void Copy_file::Copy_files(){
char ch;
inf.seekg(0);
inf.get(ch);
while(!inf.eof()){
if(ch>=‘a‘ && ch<=‘z‘)
outf.put(ch);
inf.get(ch);
}
}
void Copy_file::in_file(){
char ch;
/* inf.close();
inf.open(file1,ios::in|ios::binary);*/ // 采用關閉文件後,在打開文件可以把指針指到開頭
inf.clear();
cout<<inf.tellg();
inf.seekg(ios::beg);


// inf.seekg(5,ios::cur);
inf.get(ch);
while(!inf.eof()){
cout<<ch;
inf.get(ch);
}
cout<<endl;
}
void Copy_file::out_file(){
char ch;
outf.seekg(0);
outf.get(ch);
while(!outf.eof()){
cout<<ch;
outf.get(ch);
}
cout<<endl;
}
int main()
{
Copy_file cf;
cf.Copy_files();
cout<<"源文件內容:"<<endl;
cf.in_file();
cout<<"目的文件的內容:"<<endl;
cf.out_file();
return 0;

}

這個意思是將ss.txt的內容復制到oo.txt cout<<inf.tellg(); 輸出當前指針位置時,卻一直返回-1 怎麽都不能用inf.seekg(iOS::beg);將指針指到開頭,這個問題我查了一個早上才發現解決辦法。。。


在定位前對流狀態標誌進行清除就可以了:
   inf.clear();
   inf.seekg(0,ios::beg);

file1讀結束後,eof()返回真值時,file1的錯誤標誌被設置為eofbit,於是,後續所有針對file1的操作都不能得到預期的結果,比如tellp、tellg、seekg、seekp等,因此,在進行其他針對file1的操作前,需要清除該錯誤標誌~~~!

還有一種解決辦法是

inf.close();
inf.open(file1,ios::in|ios::binary); 關閉文件,然後再打開該文件

c++讀取文本文件的一個極其容易忽略的空行問題