2012-04-13 9 views
4

テキストファイルの文字を '?'に置き換える必要があります。期待どおりに機能しません。C、unix、write()、open()、lseek()でcharを上書きする

ファイルには 'abc'(引用符なし)のファイルがあり、lseek()、open()、write()というUNIXシステムコールを使用する必要があります。標準のCファイルI/O関数を使用することはできません。

最終的には、これをより一般化された「検索と置き換え」ユーティリティに追加することです。

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdlib.h> 

int main(){ 

int file = open("data", O_RDWR); //open file with contents 'abc' 
lseek(file,0,0); //positions at first char at beginnging of file. 
char buffer; 
read(file,&buffer, sizeof(buffer)); 
printf("%c\n", buffer); // text file containing 'abc', it prints 'a'. 

if (buffer == 'a'){ 
    char copy = '?'; 
    write(file,&copy,1); //text file containing 'abc' puts '?' were 'b' is. 
    } 

close(file); 
} 

ファイル "のデータが" ABCが含まれている、私はを交換したいですか?とBC?それ作るが、私は

読み取り()がは、次の文字に書き込んでいる)(右の文字を読んだが、書き込みはC?取得しています。 これはなぜですか?

時間をGoogleで検索しています。

ありがとう

+0

苦い経験から、グーグルで作業しているコードを見つけて、迷惑をかけてしまっています(誰も作業コードの助けを必要としません)。だから:if ** if(buffer == 'a')** put ** lseek(file、-1、1); **これは動作します – Pygar

答えて

5

答えは、実際にはあなた自身のコードに埋め込まれています。

は、最初にopenファイルを読み込んだときに現在のシークオフセットがゼロであるため、openの直後に呼び出します。

readまたはwriteが成功するたびに、シークオフセットは読み書きされたバイト数だけ前方に移動します。 (あなたはインクルードオフセット求めるあなたopenからO_APPENDを追加する場合も、現在のエンド・オブ・ファイルに、ちょうど各書き込み前に移動し、それがこの時点では関係がないのです。)

あなたが成功しread 1バイト以来、シークオフセットは0から1に移動します。0に戻したい場合は、手動で行う必要があります。

(また、各操作は、実際にはもちろん、成功したことを確認する必要がありますが、私はあなたがここに簡潔にするためにそれを残し前提としています。)

0

あなたの呼び出しを読み取るために()前進1バイトのファイルポインタを移動 - から、すなわち、 0から1までです。読み書きに同じファイル記述子( "int file = ...")を使用しているので、読み書きの位置は同じです。

がちょうど読み込まれたバイトを上書きするには、

(buffer == 'a') 

が叶う後に戻って1バイト)(にlseekする必要があります。

0

lseekは間違った場所にあります。 'a'が見つかると、 '?'次の利用可能な場所(これは、 'b'を上書きすることになります)にあります。修正するには、書き込む前にlseekを使用して現在の位置を変更する必要があります。

if (buffer == 'a'){ 
char copy = '?'; 
lseek(file,0,SEEK_SET); //positions at first char at beginnging of file. 
write(file,&copy,1); //text file containing 'abc' puts '?' were 'b' is. 
} 
関連する問題