2009-06-29 2 views
1

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

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

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

любые идеи?

ответ

0

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

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

4

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

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

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

Edit: Я просто заметил:

unsigned char key[16]; 

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

int key[16]; 
+0

строка формата, переданная в scanf, содержит «% d», поэтому ключ должен быть int [], а не char [] –

+0

Да, но альтернативой является, очевидно, изменение строки формата! На самом деле непонятно, что спрашивает код. – 2009-06-29 13:14:52

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); 
+0

Почему вкладки в fscanf? и зачем читать символ char? – hhafez

+0

Большое спасибо, теперь он работает, основная проблема заключалась в том, что файл не был открыт в режиме чтения – 2009-06-29 10:23:33

+0

В цикле «для» он хочет заполнить «ключ» массив одним символом за раз. Поэтому он не может использовать «% d». –

2

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

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

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

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

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

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

0

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

Возможно, вам также захочется проверить, что файл был открыт до его использования. – 2009-06-29 13:09:54

+0

@Neil, сделано. Спасибо за предложение. –

0

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

Чтобы ответить на ваш вопрос причина нулей, что вы открываете файл с «а» то есть добавления. «r» для чтения следует использовать.

Смежные вопросы