freopen再次但在fseek之后仍然无法阅读

时间:2014-01-17 02:35:50

标签: c++ cin fseek freopen

我在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;
}

3 个答案:

答案 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;
}