c++ファイル内の文字を読み込み、空白文字をフィルタしない

2523 ワード

1)問題の説明
C++テキストファイルを読み込むとき、直接ストリームの>>メソッドで空白文字を入力の境界文字として自動的に使用するので、次のコードに問題があります.
ifstream infile("xxx.txt",ios::in);
while(!infile.eof()){
	infile>>c;
	while( (c!=' ') && (c!='\t') && (c!='
') ){ word[pos]=c; pos++; infile>>c; } word[pos]='\0'; if(pos!=0){ cout<<word<<endl; } pos=0; }

例えばtest.txtファイル
my name is zhccl
infile>>cで「my」の「y」を読むと、次は自動的にスペース記号がフィルタされます.スペース記号は標準として入力された非有効文字で、次は「n」を読み込むので、ワード=「mynameiszhccl」をセグメント全体に読み込むことになります
my,name,is,zhcclはそれぞれ読めません
2)ソリューション
1.infile.getline()は、解決するために、一度に「」を1つ読むまで、空白記号を境界記号としてword[]を解釈します.
2.infile>>noskipwsで;をクリックします.
コードは次のとおりです.
/*
 *         ,      
 * cc 20120904
 */
#include <iostream>
#include <fstream>
using namespace std;

int main(){
	ifstream infile("d:\\f2.txt",ios::in); //         
		//        
		if(!infile) {
		cerr<<"open error!"<<endl;
		exit(1);
	}
	
	char c;
	int pos;
	char word[50];
	//            c ,    word   
	pos=0;

	//      ,          '
' infile>>noskipws; while(!infile.eof()){ infile>>c; while( (c!=' ') && (c!='\t') && (c!='
') ){ word[pos]=c; pos++; infile>>c; } word[pos]='\0'; if(pos!=0){ cout<<word<<endl; } pos=0; } infile.close(); return 0; }

ここでちょっと問題がありますが、ファイルが最後に「」でなければなりません.そうしないとプログラムがクラッシュします.私はこの点を悩んでいます.
継続的な更新:
理由が見つかりました.ファイルtestです.txt 
my name is zhccl
「zhccl」を読む準備をしている場合、while(!infile.eof()はパスしたと判断し、そのまま読み続けます.infile>>cはファイルの最後まで読んだことを知っています.infile=0で、inflieが最後まで読んだかどうかを検証していません.したがって、cの値は前の読み込み文字「l」を維持し、ファイルの読み込み文字から更新されません.つまり、最後に読み込まれた文字列は「」です.zhccllllllllllll.....「ワード[]がオーバーフローするまで、エラーが発生しました.
修正方法:
Infileの状況を確認する
while(!infile.eof()){
	infile>>c;
	while( (c!=' ') && (c!='\t') && (c!='
') ){ word[pos]=c; pos++; if( (infile>>c)==0){ break; } } word[pos]='\0'; pos=0; }

または、ファイルが終了したかどうかを2回チェックします.
while(!infile.eof()){
	infile>>c;
	while( (c!=' ') && (c!='\t') && (c!='
') && (!infile.eof())){ word[pos]=c; pos++; } word[pos]='\0'; pos=0; }