2012-07-18 4 views
1

push_back 함수를 사용하여 벡터에 텍스트 파일의 줄을 채 웁니다. 하지만 모든 항목을 마지막 줄로 덮어 씁니다. 다음은 소스 코드입니다.벡터 <char*> push_back은 모든 항목을 덮어 씁니다.

int main() { 
    std::vector<char*> lines; 
    FILE* file; 
    file = fopen("textfile.txt", "r"); 
    const size_t max_line_length = 1000; 
    char line[max_line_length + 1]; 
    while (!feof(file)) { 
     fgets(line, max_line_length, file); 
     lines.push_back(line); 
    } 
    fclose(file); 
} 

누군가가 도와 줄 수 있습니다.

+0

fstream 및 std :: string을 사용할 수없는 이유가 있습니까? – milleniumbug

+1

@milleniumbug 그는 아마도 그들과 같은 실수를 저지를 것입니다. 'feof()'는 예측 적이 지 않으므로 각 입력을 테스트하지 않으면 안됩니다. –

답변

8

라인을 덮어 쓰고 있으며 실제로는 깊은 복사본을 만들지 않으므로 저장하는 유일한 것입니다. 대신이 시도 :

int main() { 
    std::vector<std::string> lines; // <- change this! 
    FILE* file; 
    file = fopen("textfile.txt", "r"); 
    const size_t max_line_length = 1000; 
    char line[max_line_length + 1]; 
    while (!feof(file)) { 
     fgets(line, max_line_length, file); 
     lines.push_back(line); 
    } 
    fclose(file); 
} 
+3

배열에 여분의 줄이 생깁니다 (아마도 어쨌든 --- 실제로 지정되지 않았습니다). 'feof'는'std :: basic_ios <> :: eof()'와 매우 비슷합니다; 입력이 실패한 후에 만 ​​사용됩니다. 루프는'while (fgets (line, max_line_length, file))'이어야합니다. –

1

을 당신은 벡터의 모든 위치에 같은 버퍼 (line)을 추진하고있다. 당신도해야합니다 : (

  1. 이 @milleniumbug 제안으로 모든 라인에
  2. 사용 표준 : : 문자열을 line 버퍼를 복사 new
  3. 사용 strdup를 사용하여 모든 라인에 대한 새로운 숯불 *를 재 할당 내 좋아하는)