0

次のようなアーカイブ ファイルがあります。

!<arch>
file1.txt/      1350248044  45503 13036 100660  28        `
hello
this is sample file 1

ここで、ヘッダーの数字 28 がfile1.txtサイズです。その数を取得するには、次を使用します。

  int curr_char;
  char file_size[10];
  int int_file_size;

  curr_char = fgetc(arch_file);

  while(curr_char != ' '){
    strcat(file_size, &curr_char);
    curr_char = fgetc(arch_file);
  }

 // Convert the characters to the corresponding integer value using atoi()
 int_file_size = atoi(file_size);

ただし、file_sizeコードを実行するたびに配列の値が変わります。正しい場合もありますが、ほとんどはそうではありません。ここに私が得るもののいくつかの例がありますfile_size:

?28`U

2U8U

28 <---正解!

パイ?28

問題は strcat() 関数にあると思いますが、よくわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

1

&curr_charは であるため、文字列を表すかint*のように のビットをコピーしています。int

を使用する必要がありますscanf

于 2012-10-22T22:43:17.120 に答える
1

ファイルの文字を読むべきではありません。これを行う高レベルの関数があります。larsmans がすでに指摘したようにfscanf()、このタスクには次を使用できます。

fscanf(arch_file, "%d", &int_file_size);
于 2012-10-22T22:50:56.100 に答える
1

&curr_charは単一の文字を指します (実際には、宣言したとおりの整数です)。strcatは文字列を探します。ご存知のように文字列は文字で終了します'\0'。したがってstrcat、あなたの場合は、&curr_charポインターを文字列のアドレスとして使用し、ターミネーターを探します。それが見つからないので、奇妙なことが起こります。

これを解決する 1 つの方法は、curr_charゼロ (文字列ターミネータ文字) に初期化された配列を作成し、最初のエントリに読み込むことです。

char curr_char[2] = { '\0' };  /* Will make all character in array be zero */

...

curr_char[0] = fgetc(...);

別の問題もあります。それは、初期化されていない文字列に連結しようとしているということです。プログラムを実行すると、配列には任意file_sizeのデータを含めることができ、自動的にゼロにはなりません。これにより、数字の前に奇妙な文字が表示されます。これは、配列を初期化することにより、上記の問題と同じ方法で部分的に解決されます。

char file_size[10] = { '\0' };
于 2012-10-22T22:51:21.467 に答える