2013-11-14 4 views
1

의 배열의 인덱스를 분리하고 다음과 같은 문자열 배열의 고유 인덱스에 넣어 이르렀 :C는 파일의 라인을 복용하고 난 파일의 라인을 위해 노력하고있어 문자열

char *fileString[newline_count]; 
     rewind(makeFile); 
     int i; 
     int i2 = 0; 
     int i3 = 0; 
     char temp[500]; 
     for(i = 0; i < string_size; i++){ 
      temp[i3] = fgetc(makeFile); 
      if(temp[i3] == '\n'){ 
       temp[i3] = '\0'; 
       fileString[i2] = temp; 
       i2++; 
       i3 = 0; 
      }else{ 
       i3++; 
      } 
     } 

     for(i = 0; i < newline_count; i++){ 
      printf("%s %c", fileString[i], '\n'); 
     } 

마지막 for 루프는 문자열의 배열 인 fileString의 contect를 출력합니다. i는 첫 번째 for 루프의 인덱스이고, i2는 fileString의 인덱스이며, i3은 temp 문자열에 저장된 tempString에 대한 인덱스입니다. fileString의 내용이 왜 마지막 줄인 인 지 궁금합니다. 마지막 for 루프는 파일의 마지막 행을 파일 내에있는 행의 양만큼 출력합니다. 나는 완전히 잃어 버렸고 매우 피곤해서 여기에서 도움을 구합니다. 나는 그것을 매우 감사 할 것이다.

답변

1

각 반복에서 temp 버퍼는 fileString의 각 위치에 할당됩니다. 즉, 배열의 모든 항목은 동일한 버퍼 (끝에 읽힌 마지막 행을 포함)를 가리 킵니다.

A "빠른"수정은 해당 줄을 변경하는 것입니다 : 이렇게하면

fileString[i2] = strdup(temp); 

, 당신은 누출을 피하기 위해 각 항목을 확보 할 필요가있다.

1

temp을 모든 색인 fileString에 할당합니다. 이로 인해 fileString의 모든 요소는 temp 배열의 첫 번째 요소와 같은 것을 가리 킵니다. 새로운 줄마다 temp의 내용을 계속 덮어 쓰므로 파일을 읽었을 때 마지막 줄만 포함합니다.

당신은하지 임시 temp 배열에, 그 사본에, 및 점 fileString을 유지하기 위해 다른 곳 temp (독특한)의 내용을 복사해야합니다. 예를 들어, malloc 각 줄을 읽은 후 충분한 길이의 새 메모리와 temp의 줄을 strcpy (해당 작업을 완료 한 후 free)해야합니다. 가장 빠른 방법은 을 사용하는 것입니다.이 작업은 기본적으로 mallocstrcpy을 결합한 것이지만 비표준 함수입니다. 따라서 실천을 위해 아무것도하지 않으면 직접 strdup을 구현하십시오.

1

각 개별 문자를 읽고 문자열에 넣지 않아도됩니다. fgets()를 사용하십시오. 각 줄마다 메모리를 할당하고 데이터를 가져온 다음 할당 된 데이터에 대한 포인터를 일부 데이터 구조에 저장합니다. 예를 들어

, 작업이 완료되면

// Allocate an array pointers, using 1000 as our initial size. 
    int lineReferencesSize = 1000; 
    char **lineReferences = (char **) malloc (sizeof(char *) * lineReferencesSize); 
    char buf[100]; 

    int i = 0; 
    while(fgets(buf, 100, fin)) { 
    lineReferences[i] = strdup(buf); 
    i++; 
    } 

()를 확보해야합니다.

이제 lineReferences는 1000 개의 char * 포인터를 저장할 수있는 포인터의 고정 크기 배열입니다. 심각한 목적을 위해, 나는 임의의 고정 된 크기를 갖지 않는 데이터 구조를 고려할 것이다. lineReferences를 동적 배열로 만들고, 한도에 도달 할 때 크기를 조정하고, 양을 두 배로 늘리고, 앞으로 진행할 수 있습니다. 고려해야 할 몇 가지 흥미로운 사례가 있습니다 (realloc의 man 페이지를 읽으십시오).

// Allocate an array pointers, using 1000 as our initial size. 
    char *lineReferences[1000]; 
    char buf[100]; 

    int i = 0; 
    while(fgets(buf, 100, fin)) { 
    lineReferences[i] = strdup(buf); 
    i++; 
    } 

을하지만 그것은 다른 형태로 무슨 일이 일어나고 있는지 이해하는 것이 중요합니다 :

당신은 다른 방법뿐만 아니라 이런 식으로 쓸 수 있습니다.

관련 문제