2009-05-13 2 views
2

FILE * F가 _sfopen()에서 열림 while (! feof (f)) 파일을 읽고 있습니다. 그리고 나서 fgets (str, 1024, f)가 실행 중일 때 마지막 라인에 도달했을 때 fgets을 시도 할 때 액세스 위반 arror로 난파된다 (menwhile 나는 try and catch (...) 그러나 나는 그것이 좋은 해결책이 아니라는 것을 안다.) 내가 문제를 고치기 위해 바꿀 것은 무엇인가?fgets()를 사용하여 파일을 읽으면 "주소에서 읽는 액세스 위반이 발생합니다."C++

플러스 - 한 줄씩 읽으 려한다면 1024 자의 크기를 지정하는 것이 정확하거나 실패 할 수도 있습니다. 줄 중간까지 매번 읽는 크기 때문에 파일이있었습니다. 다음 줄의 중간 - 줄을 읽는 더 좋은 방법은 내 파일이 어떻게 보이는지 모르기 때문에 (끝 부분에 \ n이 있다면 ...)

감사합니다!

+6

사용중인 코드를 게시하십시오. –

+0

std :: ifstream 대신 FILE을 사용해야하는 특별한 이유가 있습니까? – Jem

+0

char buf [1024], * p; while (fgets (buf, sizeof (buf), fp)! = NULL) { do something ... } – sofr

답변

0

C++을 태그로 지정한 경우 파일 스트림 (파일에서 입력 할 경우 std :: ifstream)을 사용하고 getline() 전역 함수를 사용하여 줄 단위로 가져 와서 추가 분석/조작을 위해 std :: string에 넣을 수 있습니다. 예를 들어

here ("텍스트 파일"단락의 2 예)를 보면

0

특히 "주의 사항"섹션에있는 here을보십시오.

3

당신은 EOF 플래그가 후 때까지 설정되지 않기 때문에이 깨진 후 while(!feof(f)) 전에 반드시 숙지하지 않은 경우 읽기가 완료되었습니다. 대신 다음과 같이하십시오 :

char buf[1024]; 
while(fgets(buf, sizeof(buf), f)) { 
    /* process the line */ 
} 

fgets는 읽기 실패 또는 EOF에서 NULL을 반환하도록 정의 되었기 때문에.

이 작업을 C++에서 수행하는 경우 유사한 패턴을 사용하는 것이 좋습니다 (대신 C++ iostreams 사용).

std::ifstream file("filename.txt"); 
std::string line; 
while(std::getline(file, line)) { 
    // process the line 
} 
관련 문제