2014-01-17 9 views
2

나는 C++에서 다음과 같은 것을 가지고있다.freopen 다시 fseek 후에도 읽을 수 없다

여러 번 파일을 읽지 만 실패했습니다.

다시 freopen 한 후 fseek를 사용하여 파일의 헤드로 이동하지만 여전히 한 번만 읽을 수 있습니다. 두 번째로, cin은 아무것도 얻지 못합니다. @.

나는 정말 그걸로 혼란스러워. 정말 권장되지 않는 파일을 읽을 C++과 C를 혼합

#include <cstdio> 
#include <cstdlib> 
#include <iostream> 
#include <cmath> 
#include <cstring> 
using namespace std; 

int main(){ 
    for (int i=0; i<2; i++) { 
     freopen("windmill02.mtl", "r", stdin); 
     fseek(stdin, 0, 0); 
     string s0, name, filename; 
     while (cin>>s0) { 
      cin>>name; 
      cin>>filename; 
      cout <<name<<" "<<filename<<endl; 
     } 
     freopen("ke.txt","r",stdin); 
    } 
    return 0; 
} 
+0

? 우리가'fstream'과'seekg' 등을 사용하지 않는 이유가 있을까요? – tabstop

+0

windmill02.mtl 파일의 형식은 무엇입니까? txt 파일입니까? – michaeltang

+0

예, '\ t'로 나눈 문자열이 포함되어 있습니다. – user2759293

답변

2

는 (... C의 freopen을 작동 할 것 같다,하지만 난 정말 CIN을 사용하려면). 그것은 처음에는 작동하지만 stdin에서 찾는 것으로 보인다. 항상 파일 끝에있는 cin과 동기화가 해제된다.

int main(){ 
    char s0[256]; 
    char name[256]; 
    char filename[256]; 

    freopen("windmill02.mtl", "r", stdin); 

    for (int i=0; i<2; i++) { 
     fseek(stdin, 0, 0); 

     while (!feof(stdin)) { 
      scanf("%s", s0); 
      scanf("%s", name); 
      scanf("%s", filename); 

      cout << name << " " << filename << endl; 
     } 
    } 

    fclose(stdin); 
    return 0; 
} 
1

이유 frepoen 표준 입력 : 당신이 C에서 모든 것을 않았기 때문에, 여기에 대신 scanf와를 사용하여 작업 버전이다?

Cio와 C++ io를 섞어서 사용하지 마십시오.

외부 파일을 읽어야 할 경우 fstream을 사용하십시오. freopen stdio는 여기에 혜택을 가져다주지 않습니다.

그리고 stdin은 fseek와 함께 작동하지 않을 것입니다. fseek는 물리적으로 존재하는 파일에서 작동하지만 stdin/stdout은 실제로 파이프 또는 콘솔 장치와 연관된 가상 파일이며 순차적이며 다른 위치를 찾을 수 없습니다. fseek가 응답하는 방식은 플랫폼에 따라 달라지는 파일 스트림 속성에 따라 다르며 freopen에 의해 변경 될 수 없습니다.

코드를 테스트했는데 시스템에서 정상적으로 작동합니다.

0

C++ 방법 우리는 바로, C++에있어

#include <iostream> 
#include <fstream> 
#include <string> 

int main() 
{ 
    const char *filenames[] = {"windmill02.mtl", "ke.txt"}; 
    std::string s0, name, fname;  

    for (const char **fptr = &filenames[0]; fptr != &filenames[2]; ++fptr) 
    { 
     std::fstream fin (*fptr, std::ios_base::in); 
     while(fin >> s0 >> name >> fname) 
      std::cout << name << " " << fname << std::endl; 
     fin.close(); 
    } 

    return 0; 
}