У меня есть что-то, как показано ниже в 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;
}
Смешивать 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;
}
почему frepoen stdin?
Вы не должны использовать такой способ смешивания Cio и C ++ io.
если вам нужно прочитать внешний файл, используйте fstream. Freopen STDIO здесь не приносит пользы.
И stdin никогда не должен работать с fseek. fseek работает с физически существующим файлом, но stdin / stdout на самом деле является виртуальным файлом, обычно связанным с конвейером или консольным устройством, которые являются последовательными и не могут искать другую позицию. То, как fseek отвечает, зависит от атрибутов файлового потока, которые зависят от платформы и не могут быть изменены freopen.
Я проверил ваш код, он отлично работает в моей системе.
подход с ++
#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;
}