こんにちは、しんじといいます。
今、C++のファイル処理の勉強をしています。
練習問題を解いたのですが、自分が書いたプログラムでは思うように動きません。
その問題は次のような問題です。
テキストファイル内の2文字を1組として順序を入れ替えるプログラムを作成しなさい。
例:1234→2134となるようにしなさい。(ただし偶数個の文字列が含まれているとする。)
用意したファイル
ファイル名:test
内容:1234567890
僕が書いたプログラムは
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main()
{
fstream io(test,ios::in | ios::out | ios::binary);
if( !io )
{
cout << Cannot open file.\n;
return 1;
}
long i;
char ch[2];
//ここの部分で無限ループになってしまう。
for( i=0 ; !io.eof() ; i+=2 )
{
io.get(ch[0]);
io.get(ch[1]);
io.seekg(i,ios::beg);
io.put(ch[1]);
io.put(ch[0]);
}
io.close();
return 0;
}
参考書の答えは
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main()
{
fstream io(test,ios::in | ios::out | ios::binary);
if( !io )
{
cout << Cannot open file.\n;
return 1;
}
long i;
char ch[2];
for( i=0 ; !io.eof() ; i+=2 )
{
io.seekg(i,ios::beg); //どうしてこれが必要なの?
io.get(ch[0]);
io.get(ch[1]);
io.seekg(i,ios::beg);
io.put(ch[1]);
io.put(ch[0]);
}
io.close();
return 0;
}
出力結果
2143658709
io.seekg(i,ios::beg)があるだけで、どうしてうまく動くのですか?
わかる人があれば教えてください。
C の場合、同一ファイルに読み書きするときは、
読むのと書くのとの間にフラッシュかシークをしないといけないことになっているので、
それと同じことだと思います。
同一ファイルに読み書きすると何かとややこしいので、別ファイルに書き出すのが普通だと思います。