我在c ++中有如下内容。
我想多次阅读一个文件,但失败了。
虽然我再次开放后使用fseek移动到文件的头部,但我仍然只能阅读一次。第二次,cin得不到任何东西@。@。
我真的很困惑。
(似乎c的freopen可以工作,但我真的想用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 :(得分:2)
确实不推荐使用C和C ++混合来读取文件。它起初工作,但似乎通过在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;
}
始终位于文件末尾。由于您使用C语言完成了所有操作,因此这是一个使用scanf的版本:
{{1}}
答案 1 :(得分:1)
你不应该用这种方式混合Cio和C ++ io。
如果您需要阅读外部文件,请使用fstream。 freopen stdio在这里没有带来好处。
而且,stdin永远不应该与fseek合作。 fseek适用于物理上存在的文件,但是stdin / stdout实际上是一个通常与管道或控制台设备相关联的虚拟文件,它们是顺序的,不能寻找其他位置。 fseek如何响应取决于文件流属性,这取决于平台,并且freopen不能更改。
我测试了你的代码,它在我的系统上工作正常。
答案 2 :(得分: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;
}