2014-04-18 1 views
2

텍스트 파일 (한 줄에 한 줄씩)에서 문자열을 읽고 크기별로 정렬하려고합니다. ,C - 텍스트 파일에서 문자열 읽기 및 크기로 배열

void readDic(char* file) 
{ 
    FILE* fr; 
    fr=fopen(file, "rt"); // opening the text file 
    char line[MAX_LINE_SIZE]; 
    char* word; 
    while(fgets(line, MAX_LINE_SIZE, fr)!=NULL) 
    { 
     if(line[0]!='\n') 
     { 
      word = strtok(line, "\n"); //remove the newline from the string 
      // do stuff with word 
     } 
    } 
    fclose(fr); 
} 

이 코드의 코드가 실행되지만, 내가 읽은 모든 문자열, 마지막 하나를 제외하고 파일의보다 하나의 크기와 함께 제공 :

이 내 코드입니다.

예를 들어, 문자열 "hello"의 strlen은 파일의 마지막 줄을 제외한 임의의 위치에서 6을 반환합니다. 파일의 마지막 줄에있는 경우 strlen은 5를 반환합니다.

잘못된 것이 있습니까?

+2

더 많은 코드가 필요합니다. 귀하의 예는 단어의 길이를 결정하는 방법을 보여주지 않습니다. – JohnH

+0

'strlen (x)','x'가 "hello"가되어야하는 경우, 6을 반환한다면, 6 번째 문자가 무엇인지를 확인하는 것이 좋습니다. '\ r'와 같은 것일 수도 있습니다. (추가 반영 : * first * 위치에있을 수도 있습니다.) – usr2564301

답변

1

fgets()은 C 문자열을 읽지 않습니다. (또는 EOF 조건 또는 IO 오류가 발생하거나 버퍼가 거의 채워질 때까지 chars을 읽습니다. 그런 다음 '\0'을 버퍼에 추가하여 버퍼를 C 문자열로 만듭니다.

fgets()을 호출 한 후이 코드가 반환 한 값을 확인하는 것이 좋습니다. NULL 인 경우 EOF 조건 또는 IO 오류가 있습니다. 그렇지 않으면 버퍼에는 C 문자열이 포함됩니다. 1) char의 배열, 2) 일반적으로 마지막은 '\n'이고 3) 추가 된 '\0'입니다.

strlen(line)의 추가 긴 결과는 텍스트 파일의 마지막 줄에없는 '\n'에서 가져온 것입니다.

제안은 제거 할 수있는 어쩌면 '\n' 후행 : "\r\n""\n" 인기 있지만, "\n\r""\r"가 발생했습니다 :

size_t len = strlne(line); 
if (len > 0 && line[len-1] == '\n') line[--len] = '\0'; 

라인 엔딩은 시스템에 따라 다릅니다. 파일을 파일 "rt"으로 열거 나 "r"으로 이식 가능한 파일로 열면 시스템의 일반적인 줄 끝은 으로 변환되고 fgets()은 기본 IO에서 데이터를 요청합니다. 편집자들 사이의 다양성을 감안할 때 코드가 읽는 텍스트 파일은 예기치 않은 줄 끝을 사용하고 언급 된대로 번역되지 않을 수 있습니다.