2014-10-24 5 views
1

C로 돌아가서 파일에서 읽을 때 오류가 발생했습니다. 아래의 코드 단어는 내가 읽는 파일이 1 라인보다 길 때 좋지만 텍스트의 한 라인이 '> ??' 문자. 내가 여기서 뭘 잘못하고 있을지 궁금해.C 파일 읽기가 예기치 않은 오류가 발생했습니다.

필자는 code.txt와 해당 출력의 text.txt를 포함 시켰습니다.

사전에 도움을 청합니다.

text.txt 는

이 [H는 [2Jbash가-3.2 $ ./a.out

헬로이 문장 이다

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 


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

FILE * fp; 
char * buff; 
int i = 0; 


fp = fopen("text.txt", "a+"); 

if(fp == NULL) 
{ 
    perror("exiting\n"); 
    exit(EXIT_FAILURE); 
} 

fseek(fp, 0, SEEK_END); 
long size = ftell(fp); 
fseek(fp, 0, SEEK_SET); 

//The file read keeps adding ?? to the 2nd line of the file. I've tried the two pieces of code below 
//buff = malloc(size); 
buff = (char*) malloc(sizeof(char)*size); 

fread(buff, 1, size, fp); 

printf("%s\n\n", buff); 

fclose(fp);  


return 0; 
} 

출력 샘플 "안녕하세요 이것은 문장" v> ä

bash-3.2 $ q [Kexit 출구

+0

꼬리말 '\ 0'char를 수용하기 위해 buff의 크기를 1 바이트 늘려야 할 수 있습니다. 나는 fread가 거기에 놓을 지 모르겠다. 따라서 모든 버프 바이트를 0으로 설정하여 모든 기회를 배제하십시오. – lowtech

+1

@lowtech :'fread'는 C- 문자열이 아닌 이진 데이터를 읽을 수 있기 때문에 후행하는 0을 추가하지 않습니다. 자동으로 0 바이트를 추가하면 재앙이 될 수 있습니다! – usr2564301

+2

왜 "fread"를 사용하여 "텍스트 줄 읽기"를 사용하고 있습니까? 'fread'는 행복하게 end-of-line 문자를 포함합니다. 'fgets'를 사용하여 * lines *을 읽으십시오. 보너스로, 읽는 문자열을 0으로 끝낼 것입니다. – usr2564301

답변

2
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 


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

FILE * fp; 
char * buff; 
int i = 0; 


fp = fopen("text.txt", "a+"); 

if(fp == NULL) 
{ 
    perror("exiting\n"); 
    exit(EXIT_FAILURE); 
} 

fseek(fp, 0, SEEK_END); 
long size = ftell(fp); 
fseek(fp, 0, SEEK_SET); 

// lowtech: this is the fix of you problem 
buff = (char*) malloc(sizeof(char)*size + 1); 
memset(buff, '\0', sizeof(char)*size + 1); 

fread(buff, 1, size, fp); 

printf("%s\n\n", buff); 

fclose(fp);  


return 0; 
} 
+0

많은 감사. 나는 그것이 NULL에서 정확하게 종료되지 않는다는 것을 알았지 만 SEEK_SET과 SEEK_END가 그 정보를 제공 할 것이라고 생각했습니다. 고맙습니다. – Yawn

+0

보고 된 문제를 복제 할 수는 없지만 가능성이있는 수정이라고 동의하십시오 – Vorsprung

+1

왜 최근에 stackoverflow에서 'sizeof (char)'에 의해 무의미하게 곱하면됩니까? 그리고 하나의 함수 호출로 두 마리의 새를 죽이지 않는 것이 좋습니다 :'buff = calloc (size + 1, 1);' –

1

문자열을 null로 종료해야합니다.

+0

감사합니다. 이제 memset을 찾으십시오. – Yawn

관련 문제