性格悪い人が優勝

C++についての質問です。

あるテキストファイルを読み込み、行頭の空白文字(スペース)を
削除して、別のテキストファイルへ書き出すプログラムを
作成しています。

下記のようにコーディングを行いましたが、
読み込みファイルの1行目が書き出されず、最終行が2回
書き出される状態となってしまいました。

お手数ですが、修正箇所を教えて頂けないでしょうか。
************************************************************

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

#define INPUT_FILE "C:\\input.txt"
#define OUTPUT_FILE "C:\\output.txt"

int main()
{
ifstream fin(INPUT_FILE);
ofstream fout(OUTPUT_FILE);

char str[255];

if(!fin) {
cout << "入力ファイルを開けません\n";
return 1;
}

if(!fout) {
cout << "出力ファイルを作成できません\n";
return 1;
}

fin.getline(str,254);
while(!fin.eof())
{
std::cin.setf( std::ios::skipws ); // スペースの読み飛ばし
fin >> str;
fout << str << std::endl;
}
fin.close();
fout.close();
return 0;
}
************************************************************

よろしくお願いします。

A 回答 (3件)

finのEOFチェックを、データ取得直後にしたら。


while(1) {
fin >> str;
if( fin.eof() ) {
break;
}
fout << str << std::endl;
}
ってな感じに。
    • good
    • 0
この回答へのお礼

記載して頂いた内容で解決に至りました。

ありがとう御座いました。

お礼日時:2008/01/08 11:40

よく考えたら、operator>> はデフォルトで先頭のスペースをスキップするので setf する必要もないような気がする。



>このプログラムでは、テキストの最後に改行コード
>が含まれていると、最終行が2回書き出されてしまいます。
改行も空白文字だから、fin >> str した時に一文字も str に書き込まれずに、前回の内容が残っているのでしょう。多分。

正直、operator>> で単語ごとに読み込むよりも、getline で行単位で読んで自前で空白をカットした方がよいように思います。
    • good
    • 0
この回答へのお礼

ご回答頂きありがとう御座いました。

getlineを使用しても試していたのですが、
なかなかうまくいかずに困っておりました。

具体的な方法についてお分かりでしたら、
教えて頂けないでしょうか。

よろしくお願いします。

お礼日時:2008/01/08 09:31

いろいろ置いておいて。



>fin.getline(str,254);
>while(!fin.eof())
>{
> std::cin.setf( std::ios::skipws ); // スペースの読み飛ばし
> fin >> str;
> fout << str << std::endl;
>}

最初に fin.getline() で読んで、while ループで fin >> str ともっかい読んでる。
だいたいなんで std::cin に対して setf してるの?
行の途中に空白があった場合はどうするの?
    • good
    • 0
この回答へのお礼

ご回答ありがとう御座いました。

すいません、質問を投稿した後に誤りに気づきました。
実際は、下記のプログラムになります。

このプログラムでは、テキストの最後に改行コード
が含まれていると、最終行が2回書き出されてしまいます。

if文で改行コード判定すれば良いかと思うのですが、
方法が分かりませんでした。
お手数ですが、解決方法を教えて頂けないでしょうか。

また、行の途中には空白は無いとして考えています。

*******************************

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

#define INPUT_FILE "C:\\input.txt"
#define OUTPUT_FILE "C:\\output.txt"

int main()
{
ifstream fin(INPUT_FILE);
ofstream fout(OUTPUT_FILE);

char str[255];

if(!fin) {
cout << "入力ファイルを開けません\n";
return 1;
}

if(!fout) {
cout << "出力ファイルを作成できません\n";
return 1;
}

fin.setf( std::ios::skipws ); // スペースの読み飛ばし
while(!fin.eof())
{
fin >> str;
fout << str << std::endl;
}
fin.close();
fout.close();
return 0;
}

*******************************

<上記プログラムの実行例>

読み込むテキスト
----------------
名前1
名前2
名前3

----------------

書き出されるテキスト
----------------
名前1
名前2
名前3
名前3 ←余計な行が書き出されてしまう

----------------

よろしくお願いします。

お礼日時:2008/01/07 22:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!