снова открывается, но не может прочитать после fseek

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

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

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

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

(Кажется, что freesen 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;
}

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;
}
2

Другие решения

почему frepoen stdin?

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

если вам нужно прочитать внешний файл, используйте fstream. Freopen STDIO здесь не приносит пользы.

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

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

1

подход с ++

#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;
}
0
По вопросам рекламы [email protected]