2010-07-13 2 views
0

텍스트 파일 (가변 폭)에서 여러 라인을 읽고 C 문자열 모두를 어떻게 저장할 수 있습니까?파일에서 C로 된 문자열로 복수 라인 읽기

편집 : 나는 문자열을 fget'ing하고 (realloc을 통해) 하나의 유연한 버퍼에 저장하는 것 같아요 :) 또한 이것은 분명히 그렇게 보이지만 숙제가 아닙니다 (프로그래밍은 나에게 취미 일뿐입니다.). 나는 방금 호기심을 묻는 중이었습니다

+0

이 숙제가 있습니까? 우리에게 보여줄 수있는 것을 시도 했습니까? 공유 할 세부 사항이 더 있습니까? – Cogwheel

+0

아니요, 숙제가 아닙니다. 그냥 즐겁게 (내 연구는 건강 관리에있어) 나는 fgets로 문자열을 읽은 다음 하나의 마지막 문자열로 함께 strcat'ing하는 것을 생각했지만보다 효율적인 방법이 있는지 알고 싶었다. 가능한 답글을 읽는 동안 나는 그것을 시험해 볼 것이다. :) – pwseo

답변

1

여기서 초기 버퍼를 생성 일반 과정

  1. 이다.
  2. 파일에서 한 줄을 읽거나 버퍼의 나머지 공간까지 읽습니다.
  3. EOF? 6으로 건너 뛰십시오.
  4. 완충액을 채우셨습니까? 더 많은 공간을 재 할당하십시오.
  5. 린스하고 반복하십시오. 이 분명히 숙제를하지 않기 때문에
  6. 가 종료 0
+0

그게 내가 생각한거야. 내가 알지 못했던 추상화가있을 수 있기 때문에 나는 물었다. 어쨌든 고맙습니다. – pwseo

+0

'string.h'에는 몇 가지 추가 문자열 방법이 있지만 문제에는 직접 적용 할 수있는 방법이 없습니다. C로 프로그램하고 싶다면 이런 종류의 일을하는 데 익숙해 져야합니다. –

+0

그리고 C의 낮은 수준을 좋아해요.하지만 가끔은 게으른 LOL 일뿐입니다. – pwseo

0

이 숙제입니까? 여기 까다로운 점은 문자열의 길이와 그것의 사용량/비어있는 부분을 추적해야한다는 것입니다. 공간이 부족한 경우 처음에는 충분히 높이거나 malloc() 또는 그 형제 중 한 명에게 전화하십시오.

+0

자주이 숙제가 있습니까? : \ 어쨋든, 나는 malloc과 realloc을 사용하여 그것을 할 것이다. – pwseo

+0

@pwseo : 분명히 :) – Cogwheel

1

을 추가, 여기에 내가 그것을 할 거라고 방법에 대한 몇 가지 샘플 코드입니다. 난 결국 전체 파일을위한 거대한 메모리 블록을 할당하고있다. 어쨌든 모든 것을 읽을 것이기 때문에 큰 파일을 다루는 경우에는 한 번에 한 라인 씩 처리하는 것이 더 좋다.

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

int main(int argc, char *argv[]) 
{ 
     // first, get the name of the file as an argument 
     if (argc != 2) { 
       printf("SYNTAX: %s <input file>\n", argv[0]); 
       return -1; 
     } 

     // open the file 
     FILE* fp = fopen(argv[1], "r"); 

     if (fp == NULL) { 
       printf("ERROR: couldn't open file\n"); 
       return -2; 
     } 

     // seek to the end to get the length 
     // you may want to do some error-checking here 
     fseek(fp, 0, SEEK_END); 
     long length = ftell(fp); 

     // we need to seek back to the start so we can read from it 
     fseek(fp, 0, SEEK_SET); 

     // allocate a block of memory for this thing 
     // the +1 is for the nul-terminator 
     char* buffer = malloc((length + 1) * sizeof(char)); 

     if (buffer == NULL) { 
       printf("ERROR: not enough memory to read file\n"); 
       return -3; 
     } 

     // now for the meat. read in the file chunk by chunk till we're done 
     long offset = 0; 
     while (!feof(fp) && offset < length) { 
       printf("reading from offset %d...\n", offset); 
       offset += fread(buffer + offset, sizeof(char), length-offset, fp); 
     } 

     // buffer now contains your file 
     // but if we're going to print it, we should nul-terminate it 
     buffer[offset] = '\0'; 
     printf("%s", buffer); 

     // always close your file pointer 
     fclose(fp); 

     return 0; 
} 

필자는 C 코드를 작성한 지 오래되었습니다. 사람들은 도움이되는 교정/거대한 문제에 대한 고지를 통해 전화를 걸기를 바랍니다. :)

+0

흥미로운 해결책입니다 ... 방금 나에게 아이디어를주었습니다. 내 파일 전체에 일부 구분 기호가 있습니다 ...파일을 미리 스캔하고 구분 기호 목록을 작성한 다음 다시 목록을 사용하여 메모리를 할당 할 수 있습니다 (두 구분자의 위치 차이는 두 문자열 사이의 문자열 크기 임). 감사합니다. – pwseo

+0

'fseek' +'ftell' +'fseek' 대신에'fstat'로 파일 길이를 얻는 것은 어떻습니까? –

0

당신은 여기에 "가변 길이"문자열 구현을 시도 할 수 있습니다 :

How to implement a variable-length ‘string’-y in C

를 그리고, 당신은 문자열로 "추가"쓰기 작업을해야합니다. 그런 다음 안전하게 모든 바이트 청크를 읽고 이미 읽은 것과 연결합니다.

+0

나는 과거에 가변 길이 문자열 유형을 구현 했으므로 대신 그 문자열을 사용할 예정이지만 어쨌든 Baltasarq :) – pwseo