2010-04-30 4 views
1

fgets 및 sscanf를 사용하여 파일에서 읽으려고합니다. 내 파일에는 벡터의 각 줄에 문자를 넣고 싶습니다. 지금까지 나는 다음과 같은 것을 가지고있다 :C++ 파일 입출력

FILE *fp; 
    fp = fopen(filename, "r"); 
    if(!fp) 
    { 
    fprintf(stderr, "Unable to open file %s\n", filename); 
    return 0; 
    } 
    // Read file 
    int line_count = 0; 
    char buffer[1024]; 
    while(fgets(buffer, 1023, fp)) 
    { 
    // Increment line counter 
    line_count++; 

    char *bufferp = buffer; 

    ... 

    while(*bufferp != '\n') 
    { 
     char *tmp; 
     if(sscanf(bufferp, "%c", tmp) != 1) 
     { 
     fprintf(stderr, "Syntax error reading axiom on " 
       "line %d in file %s\n", line_count, filename); 
     return 0; 
     } 

     axiom.push_back(tmp); 
     printf("put %s in axiom vector\n", axiom[axiom.size()-1]); 

     // increment buffer pointer 
     bufferp++; 
    } 
    } 

내 공리 벡터는 vector<char *> axiom;으로 정의된다. 프로그램을 실행할 때 오류가 발생합니다. 내가 sscanf을 할 때 일어납니다. 내가 뭘 잘못하고 있는지에 대한 제안은?

답변

2

tmp은 포인터가 아니고 배열이기 때문에 버퍼 오버런이 발생합니다.

는 시작 당신은에 tmp의 decleration을 변경해야합니다 :

char *tmp = malloc(SOME_MAXIMUM_SIZE * sizeof(char)); 

다음은 작업이 완료되면 axioms에 포인터를 모두 무료로 기억한다.

2

더 안전한 방법은 std::stringstd::vector<std::string>입니다.

string 유형은 텍스트의 메모리 할당을 처리합니다. getlinestd::string::c_str()도 참조하십시오.

+1

std :: string을 사용하는 단계를 수행하려는 경우 (전심으로 권장합니다) 파일 I/O에 대한 C++ I/O 클래스로 전환 할 수도 있습니다 (즉, fstream). – rmeador