2016-12-26 1 views
1

fread 함수를 사용하여 파일에서 문자열을 읽고 문자열을 출력하고 있습니다. 문자열을 LONGNUM 크기 (미리 정의 된 값) 인 char 배열로 정의했습니다. 매번 1 엘리먼트의 1 바이트 크기를 읽었습니다. 문자열을 인쇄 할 때 : printf ("읽은 문자열은 % s \ n", 버퍼); 출력은 다음과 같습니다. 읽은 문자열은 입니다. 문자열의 끝에이 값이 나타나는 이유는 무엇입니까? 문자열을 인쇄 할 때 : printf ("읽은 문자열은 % c \ n", 버퍼 [0]); 값없이 쓰기 출력을 얻습니다. 이유를 설명해주세요.% s 인쇄 문자열이 잘못된 데이터를 인쇄합니다.

코드는

#include <stdio.h> 
#define LONGNUM 1 

void main(int argc,char *argv[]) 
{ 

    FILE * src; 
    FILE * dst; 
    int num; 
    char buffer[LONGNUM]; 

    // argc is the number of the elements in argv 
    // the first argv element is the name of the program 

    if(argc < 3){ 
     printf("prototype error <source path> <dest path>\n"); 
     return; 
    } 
    printf ("source path is : %s \n",argv[1]); 
    printf ("dest path is : %s \n",argv[2]); 

    src = fopen(argv[1],"r"); 

    while(!(feof(src))){ 
     num = fread(buffer,1,1,src); 
     printf("the number of items read %d\n",num); 
     printf("the string that read is %s\n",buffer); 
     //printf("the string that read is %c\n",buffer[0]); 

    } 

} 

입니다 당신이 그것을 할 수있는 쓰기 방법이 무엇인지 나에게 조언을하고 싶습니다. 감사합니다. .

+3

'% s'은 적어도 2 바이트가 필요합니다. 그래서'LONGNUM'은 적어도 2 여야하고 문자열에 한 문자를 읽으려면'% 1s '를 지정해야합니다. 한 문자를 읽으려면'% c '를 사용할 수 있지만'string '은 null로 끝나지 않습니다. 더 현명하게,'LONGNUM'을 128 또는 4096 또는 다른 큰 것으로 설정하십시오. –

+2

while (! (feof (src))는 부적절한 항목을 테스트하고 알아야 할 항목을 테스트하지 못하기 때문에 잘못되었습니다. 결과적으로 사용자가 알고 있어야하는 항목을 테스트하는 데 오류가 발생합니다. 실제로 이것이 실제로 발생하지 않았을 때 성공적으로 읽었습니다. –

+0

@SumitGemini : 표준 x-ref 질문은 ['while (! feof (file))은 항상 잘못되었습니다.] (http://stackoverflow.com/questions/5431941/while -feof-file-is-always-wrong). –

답변

1

% s 지정자에 Null 종료 문자열이 필요합니다. fread는 문자열을 null로 종료하지 않으므로 올바른 출력을 볼 수 없습니다. buffer는 길이가 1이므로 % c는 인쇄하기위한 올바른 지정자입니다.

+1

@Stargateur : 잘못된 링크를 제공하는 것으로 보입니다. – alk

+2

'printf ("%. 1s", buffer)', [reference] (http://stackoverflow.com/a/3767300/7076153) 할 수있는 약간 잘못되었습니다. @ 고정, 감사합니다. – Stargateur

관련 문제