2012-07-08 2 views
0

잠시 동안이 문제에 봉착했습니다. 여기에 파일 이름이 들어있는 텍스트 파일을 읽는 루프가 있습니다. 루프는 이러한 라인을 하나씩 읽고 변수 sFileName을 통해 메모리에 설정합니다. sFileName은 나중에 이미지를로드하기 위해 호출되며 루프가로드 할 때마다 프로그램이 하나씩 처리합니다. 그런 다음 사용자는 이미지에 대한 태그를 선택하고 다음 태그를로드합니다. 태그와 이미지 파일 이름은 imgresults.txt라는 다른 텍스트 파일로 내보내집니다. 이제 파일 이름이있는 텍스트 파일은 수천 줄입니다. 따라서 사용자가 프로그램을 종료하고 나중에 계속하려고하면 프로그램을 닫을 때 루프를 종료하는 대신 루프가 다시 시작됩니다.C++ while 루프를 사용하여 파일을 읽는 중, "x"라인에서 시작

그 시점에서 루프를 시작하는 방법을 찾으려고합니다. 지금까지 getline()을 사용하여 이미 imgresults.txt에있는 줄 수를 계산했습니다. 이미 프로그램을 통해 실행 된 이미지의 수를 제공합니다. 이 숫자는 변수 "x"에 저장됩니다. 나는 많은 연구를 해왔지만 while 루프가 "x"라인에서 시작하도록 조건을 설정하는 방법을 찾지 못했습니다. 너희들에게 어떤 제안이 있니? 또한 설명이 필요하면 질문하십시오. 이미지를로드하는 코드가 완벽하기 때문에 루프 관련 코드 만 포함되었습니다.

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    int value = 0; 

int nCounter = 0; 
FILE* fIn = NULL; 
char * sLine = new char[MAX_FILENAME_SIZE]; 
char * sFileName = new char [MAX_FILENAME_SIZE]; 
char * s = new char [MAX_FILENAME_SIZE]; 

#define ImgListFileName "path" 
#define ImgRepository "path" 



if ((fIn = fopen(ImgListFileName,"rt"))==NULL) 

{ 
    printf("Failed to open file: %s\n",ImgListFileName); 
    return nCounter; 
} 



ifstream imgresults; 
    imgresults.open ("imgresults.txt"); 
    int x=0; 
    string line; 

    while(!imgresults.eof()) { 
     getline (imgresults, line); 
     x++; 
    } 
    srand (time(NULL)); 
    cout << x; 


    while(!feof(fIn)){ 
     memset(sLine,0,MAX_FILENAME_SIZE*sizeof(char)); 
     memset(sFileName,0,MAX_FILENAME_SIZE*sizeof(char)); 
     memset(s,0,MAX_FILENAME_SIZE*sizeof(char)); 
     fgets(sLine,MAX_FILENAME_SIZE,fIn); 
     strncpy(s,sLine,65); 
     strcat(sLine,"\0"); 
     strcat(sFileName,s); 


     printf (sFileName); 

     nCounter++; 
} 

미리 감사드립니다.

+2

http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong을 확인하십시오. – Mat

+1

'x'를 어떤 파일에도 저장해야합니다. 그리고 C++을 사용한다면, char 배열, memset, strcpy 등을 버리십시오. 'std :: string'과 표준 알고리즘을 대신 사용하십시오. – jrok

답변

1

입력 파일에서 시작해야하는 위치에 대한 정보로 imgresults.txt를 사용하려면, while 루프가 입력 파일의 x 행을 읽는 while 루프를 사용하는 것이 가장 좋습니다 루프에서 입력 파일을 읽습니다.

while (x--) { 
    fgets(sLine, MAX_FILENAME_SIZE, fIn); 
} 

더 나은 솔루션은 아마 당신이 라인으로 입력 파일 라인을 읽을 필요하지 않을 수 있도록 다른 파일 처리의 상태를 작성하는 것입니다,하지만 당신은 즉시이 파일의 오프셋 (offset)가 알려져을 시도 할 수 있습니다.

+0

잘 돌아갔습니다. 감사합니다 :) – Michael

1

ifstream::tellg을 사용하면 programm가 닫힐 때 파일의 현재 위치를 검색하고 저장할 수 있습니다.

porgram이 다시 시작될 때 ifstream::seekg을 사용하여 해당 위치를 복원하십시오.

0

각 행을 읽기 전에 입출력 파일의 현재 오프셋을 별도의 파일에 저장하고 처음부터 다시 찾고 기존 데이터를 매번 덮어 씁니다.

다시 시작할 경우 해당 파일의 오프셋을 읽고 해당 위치를 찾아 작업을 시작하십시오.

0

결과 파일의 끝에 도달하면 두 파일에서 병렬로 행을 읽을 수 있으며 중지 할 수 있습니다. 루프가 끝나면 이미 처리 된 파일 이름을 이미 버렸습니다.

ifstream results("results.txt"); 
ifstream names("names.txt"); 

if (results && names) { 
    std::string temp1, temp2; 
    while (getline(results, temp1) && getline(names, temp2)) ; /* do nothing */ 
} 

if (names) { 
    // process the rest 
} 

가장 효율적인 솔루션은 아니지만 오프셋 저장이라는 번거 로움을 덜어줍니다. 첫 번째 처리 전에 결과 파일이 완전히 비어 있거나 전혀 존재하지 않는지 확인하십시오. 그렇지 않으면이 코드는 첫 번째 파일 이름 행을 건너 뜁니다.

+0

불행히도, 채울 결과 파일이 필요합니다.프로그램을 다시 시작하면 중단 된 부분부터 계속 읽을 수 있어야하며 결과 파일에 계속 추가해야합니다. 모든 항목 다음에 '\ n'이 있으므로 제대로 작동하지 않습니다. (감사합니다. 어쨌든! – Michael

+0

@Michael 질문을 업데이트했습니다. 물론 파일을 채울 수 있습니다. – jrok

관련 문제