ファイル操作のseekgの働きがいまいち。

[戻る]
しんじ [E-Mail] 2001/10/29(月) 20:51:26
こんにちは、しんじといいます。

今、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)があるだけで、どうしてうまく動くのですか?
わかる人があれば教えてください。

kazuma 2001/10/30(火) 00:15:27
C の場合、同一ファイルに読み書きするときは、
読むのと書くのとの間にフラッシュかシークをしないといけないことになっているので、
それと同じことだと思います。

同一ファイルに読み書きすると何かとややこしいので、別ファイルに書き出すのが普通だと思います。

古いスレッドには追加発言できません。