ファイル操作のseekgの働きがいまいち。 – プログラミング – Home

ファイル操作のseekgの働きがいまい...
 
通知
すべてクリア

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


しんじ
 しんじ
(@しんじ)
ゲスト
結合: 24年前
投稿: 2
Topic starter  

こんにちは、しんじといいます。

今、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
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

C の場合、同一ファイルに読み書きするときは、
読むのと書くのとの間にフラッシュかシークをしないといけないことになっているので、
それと同じことだと思います。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました