2009-06-29 5 views
1

죄송합니다, 아마도 이것은 바보 같은 질문입니다.fscanf 독서 문제

는이 같은 파일 가지고

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

하므로 I는 프로그램 번호를 판독 할 그래서 할

:

프로그램이 화면에 결과를 출력 할 때

.... 일부 기능 .....

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

왜 fscanf에 공백과 탭이 있습니까? 입력에 탭이나 공백이 있습니까? 또한 읽지 않기 위해 추가하기 위해 파일을 열었습니다. ("a"는 추가 용이고 "r"은 읽기 용입니다)

입력 내용과 일치하도록 fscanf를 바꿀 수 있습니까?

4

당신은 읽기 모드에서 파일을 열 필요가 :

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

그것은 또한 실제로 성공 읽기 있는지 확인하기 위해 fscanf()의 반환 값을 체크하는 것이 좋습니다.

편집 : 난 그냥주의 :

unsigned char key[16]; 

(나는 생각한다 - 그것은 "키"의 의미가 무엇인지 코드에서 매우 분명하지 않다) int 배열되어야한다 :

int key[16]; 
+0

scanf에 전달 된 형식 문자열에 "% d"이 (가) 있으므로 키가 int []이고 char []가 아니어야합니다. –

+0

네,하지만 대체로 형식 문자열을 변경하는 것이 좋습니다! 질문자가 코드에서 원하는 것이 무엇인지는 분명하지 않습니다. –

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로 char을 읽는가? – hhafez

+0

덕분에 지금은 작동 중입니다. 주된 문제는 파일이 읽기 모드로 열리지 않았다는 것입니다. –

+0

"for"루프에서 그는 한 번에 "키"배열 하나를 채우고 싶어합니다. 그래서 그는 "% d"을 사용할 수 없습니다. –

2

직접 질문 BU 응답 없음 결코fscanf()을 사용하는 것이 좋습니다. 실패하면 파일 포인터가 알 수없는 상태가됩니다.

가장 좋은 해결책은 라인 읽기 기능 (예 : fgets() 또는 그 유사) 중 하나를 사용하고 나서 sscanf() 문자열을 사용하는 것입니다.

두 가지 장점을 가지고 :

  • 을 당신은 함수 포인터의 상태를 알 수 있습니다.
  • 당신이 그것을 인식 할 때까지 sscanf() 당신의 심장 내용에 문자열 수 있습니다.

scanf()"%d" 또한 문자 배열에 정수를 저장합니다. 기본 유형이 거의 틀린 크기이기 때문에 원하는 것은 아닙니다. 문자를 스캔하거나 기본 데이터 유형을 정수로 변경하십시오.

그리고 위에는 읽기 모드가 아닌 추가 모드로 파일을 여는 중입니다.

0

G'day,

난 그냥 내가, 포인터 연산을 사용하여 프로그램을 다시 열어 파일에 대한 모드를 읽을 줄 알았는데, 그래서 다시 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; 

} 
+0

파일을 사용하기 전에 파일이 실제로 열렸는지 테스트 할 수도 있습니다. –

+0

@Neil, 완료. 제안 해 주셔서 감사합니다. –

0

당신이 읽을 수있는 데이터의 양에주의해야합니다. 루프는 16 번의 반복 작업을 수행 할 때마다 'key'에 부호가있는 int를 쓰려고 시도합니다. 32 비트 시스템에서 4 번 이상 수행하고 할당 된 16 비트 (16 문자) 외부에 쓸 것이므로 정의되지 않은 동작이 발생합니다. 대신 unsigned int를 사용하면 ok입니다.

공백이 공백과 일치하므로 형식 문자열의 탭 문자는 필요하지 않습니다.

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; 

0에 대한 이유는 "a"(즉, 추가)로 파일을 여는 것입니다. 읽기에는 "r"을 사용해야합니다.