2013-11-09 3 views
0

잠시 후에 C 프로그래밍을 수행하지는 않았지만 다음과 같이 문자열을 출력하지만 배열에 넣을 수 있습니다. 코드의 주석에서 ---------을 조작하십시오. 배열의 크기를 선언해야하지만 가변 양을 처리해야한다고 생각합니다. system('wc -l filename')과 같은 것을하려고 생각했지만 정말 끔찍한 것 같습니다. 모든입력 파일에서 C로 문자열의 동적 배열을 만드는 방법

#include <stdio.h> 

int main() 
{ 
    char *inname = "test.txt"; 
    FILE *infile; 
    char line_buffer[BUFSIZ]; /* BUFSIZ is defined if you include stdio.h */ 
    char line_number; 

    infile = fopen(inname, "r"); 
    if (!infile) { 
     printf("Couldn't open file %s for reading.\n", inname); 
     return 0; 
    } 
    printf("Opened file %s for reading.\n", inname); 

    line_number = 0; 
    while (fgets(line_buffer, sizeof(line_buffer), infile)) { 
     ++line_number; 
     /* note that the newline is in the buffer */ 
     // --------------------- 
     // would like to put into an array of strings here rather than just printf'ing out out 

     printf("%4d: %s", line_number, line_buffer); 
    } 
    printf("\nTotal number of lines = %d\n", line_number); 
    return 0; 
} 

답변

2

첫째 : 더 나은 방법이어야합니다

char *inname = "test.txt"; 

const char *inname = "test.txt"; 

해야한다 그런 다음 모든 라인을 저장하기에 충분히 큰 배열을 할당 할. 미리 줄 수를 알지 못하기 때문에 지수 저장 확장을 사용할 수 있습니다. 배열이 고갈되면 배열의 크기를 두 배로 늘릴 수 있습니다.

샘플 코드 (오류 명확성을 위해 생략 검사, 생산 코드에이 복사 붙여 넣기하지 않음) :

size_t n = 0; 
size_t alloc_size = 4; 
char buffer[LINE_MAX]; 

char **arr = malloc(alloc_size * sizeof arr[0]); 

while (fgets(buffer, sizeof buffer, fp) != NULL) { 
    if (++n > alloc_size) { 
     alloc_size *= 2; 
     arr = realloc(arr, alloc_size * sizeof arr[0]); // don't do this 
    } 

    arr[n - 1] = strdup(buffer); 
} 
1

을 불행하게도 C에는 동적 배열이 없다 (당신이 벡터 같은 것을 생각하는 경우 C++). 목록을 사용할 수 있으며 파일의 행을 읽을 때마다 목록의 끝에 새 목록 항목을 추가하기 만하면됩니다.

VLA (가변 길이 배열)라는 C99 이후 "동적"배열도 있습니다. 동적 크기로 배열을 선언 할 수도 있지만 (프로그램 실행 중에는 알 수 있습니다), 이전 배열보다 크기가 큰 새 배열을 선언 할 때마다 항상 문제를 해결하는 데 도움이되지 않습니다. 예를 들어, 이것은 매우 비효율적이다.

그래서 요약하면 목록보다 나은 것을 찾기가 어려울 수 있습니다.

1

전체 파일 (파일 크기가 클 경우 느려질 수 있음)을 살펴보고 모든 "새 행"을 계산할 수 있습니다. 그런 다음이 카운트 크기로 배열을 만든 다음 파일을 되감고 모든 줄을 읽습니다.

mfg

관련 문제