2014-01-17 3 views
2

У меня есть что-то, как показано ниже в C++.freopen снова, но все еще не может читать после fseek

Я хочу несколько раз прочитать файл, но не удалось.

Хотя я использую fseek для перемещения в головную часть файла после того, как снова freopen, но я все еще могу прочитать его только один раз. Во второй раз cin ничего не получает @. @.

Я действительно смущен этим.

(кажется freopen C может работать, но я действительно хочу использовать CIN ...)

#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

Мы в C++, не так ли? Есть ли причина, по которой мы не используем 'fstream' и' seekg' и тому подобное? – tabstop

+0

Каков формат файла windmill02.mtl, это txt-файл? – michaeltang

+0

Да, он содержит строки, деленные на '\ t' – user2759293

ответ

2

Смешивание C и C++, чтобы прочитать файл на самом деле не рекомендуется. Он работает в начале, но, кажется, ищет по stdin, он де-синхронизируется с cin, который всегда находится в конце файла. Поскольку вы сделали все на C, вот версия, которая работает с использованием scanf:

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 stdin?

Вы не должны использовать такой способ для смешивания Cio и C++ io.

Если вам нужно прочитать внешний файл, используйте fstream. freopen stdio не приносит преимуществ здесь.

И, stdin никогда не должен работать с fseek. fseek работает с физически существующим файлом, но stdin/stdout фактически является виртуальным файлом, обычно связанным с канальным или консольным устройством, которые являются последовательными и не могут искать другую позицию. Как fseek отвечает, зависит от атрибутов потока файлов, который зависит от платформы и не может быть изменен freopen.

Я проверил ваш код, он отлично работает в моей системе.

0

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; 
} 
Смежные вопросы