проблема чтения fscanf - PullRequest
1 голос
/ 29 июня 2009

извините, возможно, это глупый вопрос.

У меня есть такой файл:

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 0 0 .....

есть идеи?

Ответы [ 6 ]

4 голосов
/ 29 июня 2009

Вам нужно открыть файл в режиме чтения:

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

Также неплохо проверить возвращаемое значение fscanf (), чтобы увидеть, действительно ли чтение прошло успешно.

Редактировать: Я только что заметил:

unsigned char key[16];

должен быть массивом целых чисел (я думаю - из кода не очень понятно, что означает «ключ»):

int key[16];
2 голосов
/ 29 июня 2009

Непосредственно не отвечая на ваш вопрос, но было бы неплохо никогда использовать fscanf() из-за почти полной уверенности, что в результате сбоя указатель файла останется в неизвестном состоянии.

Предпочтительным решением является использование одной из функций чтения строк (например, fgets() или аналогичных), а затем sscanf() строки, которую он вам дает.

Это имеет два преимущества:

  • вы будете знать состояние указателя функции.
  • вы можете sscanf() строка до вашего сердца, пока вы не узнаете ее.

Кроме того, когда вы scanf() a "%d", он сохраняет целое число в вашем массиве символов. Это не совсем то, что вам нужно, поскольку базовые типы почти наверняка имеют разные размеры. Сканируйте символы или измените базовый тип данных на целые.

И В довершение всего, вы открываете файл в режиме добавления, а не в режиме чтения.

0 голосов
/ 29 июня 2009

Вы должны быть осторожны с тем, сколько данных вы прочитали. Ваш цикл будет продолжаться в течение 16 итераций и каждый раз будет пытаться записать int в ключ. Сделайте это более 4 раз на 32-битной машине, и вы получите неопределенное поведение, так как вы будете писать вне 16-ти битных выделенных вами (16 символов) Используя вместо этого беззнаковый 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».

0 голосов
/ 29 июня 2009

G'day,

Мне было весело снова пробираться через K & R, поэтому я просто решил переписать вашу программу, используя арифметику указателей, режим чтения для открытого файла и проверить, действительно ли fscanf что-то читает.

НТН

ура

#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;

}
0 голосов
/ 29 июня 2009

Некоторые исправления:

  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);
0 голосов
/ 29 июня 2009

Почему у вас есть пробел и табуляция в вашем fscanf? У входа есть вкладка или пробел? Также вы открыли свой файл для добавления не для чтения. («a» для добавления, «r» для чтения)

Можете ли вы изменить свой fscanf в соответствии с вашим вводом и повторить попытку?

...