1

すみません、これはばかげた質問かもしれません。

次のようなファイルがあります。

36 146 10 53 240 133 104 28 51 81 124 ...

プログラムから数値を読み取りたいので、次のようにします。

....いくつかの機能.....

int i;
    unsigned char key[16];
    FILE *fp;

printf ("\n ------ \n");

// open filename 
fp = fopen("key.txt","a");

printf("reading 128 bit key:\n");
for (i = 0; i < 16; i++){
    fscanf(fp,"%d \t", &key[i]);
    printf ("%d \t", key[i]);
}

printf ("\n ------ \n");

fclose(fp);
return 0;

しかし、プログラムが結果を画面に出力すると、次のようになります。

0 0 0 0 0 0 0 0 0 0 0 0 .....

何か案は ?

4

6 に答える 6

4

ファイルを読み取りモードで開く必要があります。

p = fopen("key.txt","r");

fscanf() の戻り値をチェックして、読み取りが実際に成功したかどうかを確認することもお勧めします。

編集:私はちょうど気づいた:

unsigned char key[16];

int の配列である必要があります (私が思うに、「キー」の意味がコードからはあまり明確ではありません):

int key[16];
于 2009-06-29T10:10:36.350 に答える
3

あなたの質問に直接答えるわけではありませんが、失敗するとファイルポインタが不明な状態になることがほぼ確実であるため、決して使用しないことをお勧めします。fscanf()

望ましい解決策は、行読み取り関数 (同様fgets()または類似)の 1 つを使用sscanf()してから、それが提供する文字列を使用することです。

これには 2 つの利点があります。

  • 関数ポインタの状態がわかります。
  • sscanf()それを認識するまで、心ゆくまで文字列を操作できます。

さらに、 を実行scanf()する"%d"と、整数が文字配列に格納されます。基になる型はほぼ確実に異なるサイズであるため、これは実際には必要ありません。文字をスキャンするか、基になるデータ型を整数に変更してください。

さらに、読み取りモードではなく追加モードでファイルを開いています。

于 2009-06-29T10:55:00.347 に答える
0

fscanf にスペースとタブがあるのはなぜですか? 入力にタブまたはスペースがありますか? また、ファイルを読み取り用ではなく追加用に開いています。(「a」は追加用、「r」は読み取り用)

入力に一致するように fscanf を変更して、再試行できますか?

于 2009-06-29T10:10:02.857 に答える
0

こんばんは

私は再び K&R の作業を楽しんでいるので、ポインター演算、ファイルを開くための読み取りモード、および fscanf が実際に何かを読み取ることを確認することを使用して、プログラムを書き直そうと思いました。

HTH

乾杯、

#include <stdio.h>

int main() {

    unsigned int i, res, key[16];
    unsigned int *val = key;
    char *key_file = "key.txt";
    FILE *fp;

    // open filename
    if ((fp = fopen(key_file,"r")) == NULL) {
        fprintf (stderr, "%s: unable to open file %s\n", argv[0], key_file);
        return 1;
    }

    printf ("------\n");

    printf("reading 128 bit key:\n");
    while (fscanf(fp, "%u", val) == 1) {
        printf ("%u ", (*val++));
    }

    printf ("\n ------\n");

    fclose(fp);

    return 0;

}
于 2009-06-29T12:44:44.370 に答える
0

いくつかの修正:

  int i;
  unsigned char key[16];
  FILE *fp;

  printf ("\n ------ \n");

  // open filename 
  fp = fopen("key.txt","r"); // <--- Read mode

  printf("reading 128 bit key:\n");
  for (i = 0; i < 16; i++){
      fscanf(fp,"%c \t", &key[i]); // <--- %c, read it char by char
      printf ("%d \t", key[i]);
  }

  printf ("\n ------ \n");

  fclose(fp);
于 2009-06-29T10:18:08.423 に答える
0

読み取るデータの量に注意する必要があります。ループは 16 回繰り返され、そのたびに「key」に signed int を書き込もうとします。これを 32 ビット マシンで 4 回以上行うと、割り当てた 16 ビット (16 文字) の外側に書き込むため、未定義の動作が発生します。代わりに unsigned int を使用しても問題ありません。

スペースは空白と一致するため、フォーマット文字列のタブ文字は必要ありません。

int i;
unsigned int key[16]; // char -> int
FILE *fp;

printf ("\n ------ \n");

// open filename 
fp = fopen("key.txt","r"); // a -> r

printf("reading 128 bit key:\n");
for (i = 0; i < 16; i++){
    if (fscanf(fp,"%d ", &key[i]) == 1){ // tab removed. 
        printf ("%d \t", key[i]);
    } else {
        printf("Error reading key.\n");
    }
}

printf ("\n ------ \n");

fclose(fp);
return 0;

あなたの質問に答えるには、ゼロの理由は、ファイルを「a」で開くことです。つまり、追加します。読み取りを表す "r" を使用する必要があります。

于 2009-06-29T14:44:14.627 に答える