2014-07-21 4 views
0

텍스트 파일에서 알 수없는 길이의 문자열을 읽는 방법에 대한 질문이 있습니다. 프로그램이 '\ n'을 가로 질러 인쇄 될 때 인쇄합니다. 파일에 더 이상 읽을 문자열이 없다는 것을 알게되면 프로그램은 종료되어야합니다.텍스트 파일에서 길이를 알 수없는 문자열 읽기

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

#define DEFLEN 2 
#define CHUNKSZ 2 


char *getStrFromFile(FILE *fpin); 

int main(void) 
{ 
     FILE *fpin; 
     fpin = fopen("test.txt","r"); 
     int d = 0; 

while(1) 
{ 
    char *ln; 
    ln = getStrFromFile(fpin); 
    if (!ln) 
     break; 
    ++d; 
    printf("line %d : %s\n", d, ln); 
    free(ln); 
} 
    fclose(fpin); 
    return(0); 
} 



char *getStrFromFile(FILE *fpin) 
{ 

    int i = 0; 
    char *line; 


    line = (char*)malloc(DEFLEN); 

    fgets(line,strlen(line),fpin); 

     if(line[strlen(line-1)] == '\n') 

      return line; 

char *temp; 
temp = line; 
char *read; 

    read = (char*)malloc(CHUNKSZ); 

    fgets(read,strlen(read),fpin); 

    line = (char*)malloc(strlen(temp)+strlen(read)); 

    for(i; i<strlen(temp);i++); 
     line[i]=temp[i]; 

    for(i;i<strlen(read);i++); 
     line[i+strlen(temp)] = temp[i]; 

    free(read); 
    free(temp); 

    return line; 

} 

문제는 내가이 프로그램을 실행할 때 (I 메인에있는 동안 (1) 의심) 무한 루프를 실행하는 것입니다,하지만 텍스트 파일에 문자열을 출력 표시되지 않습니다 . 가 인쇄 무엇

은 다음과 같습니다

line 1 : 
line 2 : 
line 3 : 

... 등등 영원히 보인다까지.

내가 예를 들어, 인쇄 할 필요

: 4 개 라인 텍스트 파일을 읽는 프로그램의

line 1 : 0 
line 2 :
line 3 : 
line 4 : 567890 

예.

솔직히 말해서 나는 갇혀 있고 어떤 일이 잘못되었는지 알지 못합니다. 내가 뭔가를 인쇄 할이라도 있지만 ASCII 문자의 라인을 따라 뭔가이었다 한 코드 줄에서 오류를 가리 키도록 것 같습니다 177 177 + 177 177

:

line = (char*)malloc(strlen(temp)+strlen(read)); 

내가 생각할 수있는 것은 내 복귀 선이다. 부정확하다? 나는 여기에서 길을 잃는다.

+2

'strlen'은 문자열, 즉 널 종료 문자 배열에서만 사용할 수 있습니다. 당신의 코드에서'strlen'을 사용하는 대부분은 잘못된 것입니다. –

+0

char에 캐스팅 된 코드가 포함되어 있습니까? – jdanzi

+1

@YuHao가 제안했듯이,'strlen'의 사용법은 약간의 경우에 잘못되었습니다. 예를 들어,'fgets'는 버퍼 크기를 필요로합니다. malloc이 메모리를 할당하고 첫 번째 바이트가 널 종결자인 경우 'strlen'은 0을 반환합니다. malloc에 ​​전달한 내용은 fgets로 전달해야합니다. 또한 문자 색인으로'i + strlen (temp)'를 사용하기 때문에 마지막'for' 루프에서'i'를 0으로 초기화해야합니다. –

답변

0

버퍼를 읽음으로 확장해야 할 필요가 있습니다. 그러나 당신의 길은 잘못되었습니다.

char *getStrFromFile(FILE *fpin){ 
    int i=0, ch, size=DEFLEN+1; 
    if(EOF==(ch=fgetc(fpin))) 
     return NULL; 
    ungetc(ch, fpin); 
    char *line = malloc(size); 

    while(EOF!=(ch=fgetc(fpin)) && ch != '\n'){//Do not include '\n' 
     line[i++] = ch; 
     if(i==size-1){ 
      size += CHUNKSZ; 
      line = realloc(line, size); 
     } 
    } 
    line[i] = '\0'; 
    return line; 
} 
+0

이 경우 DEFLEN이란 무엇입니까? – sAguinaga

+0

@sAguinaga 문자열의 길이를 초기 크기로 의미합니다. – BLUEPIXY

+0

이 char 함수는 입력 파일에서 1 또는 모든 행을 가져 옵니까? – sAguinaga