0
char *file1charbuf=(char*)malloc(sizeof(char));
char *file2charbuf=(char*)malloc(sizeof(char));

EOF までループして、char を読み込ん*file1charbuf*file2charbufから比較します。

...
check=read(file1, file1charbuf, 1);
check2=read(file2, file2charbuf, 1);
if (*file1charbuf!=*file2charbuf){
         printf("differ: char %i, line %i\n",charpos,linepos);
         exit(1);
}
....

比較は正常に機能しますが、ポインターをヒープではなくスタックに保持したいです。また、malloc は C lib 関数です。

char *file1charbuf[1]; //1 element array of char
char *file2charbuf[1];

その比較では正しく機能しません

...
if (file1charbuf[0]!=file2charbuf[0]){
         printf("differ: char %i, line %i\n",charpos,linepos);
         exit(1);
}
...

そして2つ目の質問。見つかったらclose(file1)必要ですか?exit(1)

  • lib関数ではなく、システムコールのみを使用する必要があります。
4

5 に答える 5

5

あなたが示しているコードにはかなりの問題があります。

  1. malloc()Cで , の戻り値をキャストしないでください
  2. sizeof (char)C では常に 1 なので、このように使用しても意味がありません。
  3. 文字の配列を意味しているように見える場合、文字へのポインターの配列を宣言しています。

    char *file1charbuf[1]; //1 element array of char あるべき
    char file1charbuf[1]; /* 1-element array of char */か、もちろん、ただ
    char file1charbuf; /* 1-character buffer. */

  4. 1 バイトのバッファを使用していますがread()、これは非常に非効率的です。

  5. 文字配列 (必ずしも文字列である必要はありません。つまり、ゼロで終了する必要はありません) を複数の文字と比較するには、 を使用しますmemcmp()
  6. を呼び出すclose()前に、開いているすべてのファイル記述子を呼び出すことをお勧めしexit()ます。ほとんどのオペレーティング システムでは、プロセスが終了するとすべてのリソースが再利用されますが、明示的に行う方が適切です。ファイル I/O が buffered ベースの呼び出しを使用していた場合、それらはすべての環境で自動的にFILE*閉じられるため、その必要はありません。exit()
于 2013-04-20T11:12:57.887 に答える
0

定義は char 配列へのポインターではなく、char 配列です。

char file1charbuf[1]; //1 element array of char
char file2charbuf[1];

ヒープに割り当てられたメモリを使用する文字列の比較セマンティクスと、スタックに割り当てられたメモリの比較セマンティクスに違いはありません。

于 2013-04-20T11:16:55.620 に答える
0

char *file1charbuf[1];への 1 つのポインタの配列ですchar。1 つの配列が必要な場合はchar、 を使用しますchar file1charbuf[1]

于 2013-04-20T11:13:11.570 に答える
0

2 つのファイルを比較し、異なる行と文字をリストするコード。文字ごとではなく行ごとに比較するのではなく、行番号を追跡し、ファイルを 4K バイトのブロックにロードします。

#define BLOCKSIZE 4096

char file1charbuf[BLOCKSIZE]; //4096 character buffer in stack
char file2charbuf[BLOCKSIZE];
int linepos=1, charpos =1, i, b1, b2 ;
int file1 = open("1.txt", O_RDONLY);
int file2 = open("2.txt", O_RDONLY);

do{
   b1=read(file1, file1charbuf, BLOCKSIZE);
   b2=read(file2, file2charbuf, BLOCKSIZE);
   for(i=0; i < b1 && i < b2; ++i){
      if (file1charbuf[i]!=file2charbuf[i]){
         printf("differ: char %i, line %i\n",charpos,linepos);
         close(file1);
         close(file2);
         exit(1);
      }
      if (file1charbuf[i] == '\n'){
         ++linepos;
         charpos=0;
      }
      ++charpos;
   }
}while(   (b1 == BLOCKSIZE || (file1==STDIN && file1charbuf[b1-1] != 0x26)) 
       && (b2 == BLOCKSIZE || (file2==STDIN && file2charbuf[b2-1] != 0x26)) );

if (b1 != b2)
   printf("One bigger than the other\n");
close(file1);
close(file2);

STDIN からの読み取りについて:

Enter キーを押すと、stdin の read() がブロックを解除します。その際、それまでに入力した文字のみを読み取ることができます。これは、b1 がこれまでに入力した文字に等しいことを意味します。do-whileread が要求した 4096 バイトすべてを読み取らなかったため、この条件は失敗します。これにより、ストリームが終了したことが原因であると認識されます。\n の後に読み続けるには、while 条件を変更して、読み込んでいるファイル記述子が STDIN の場合、最後に読み込んだ文字がストリーム終了文字であると思われる文字でない限り読み続けるようにする必要があります0x26。enter と同じ方法で ^D も read() のブロックを解除することを願っています。

于 2013-04-21T10:40:47.540 に答える