2

我在 C++ 中有如下内容。

我想多次读取一个文件,但失败了。

虽然我再次使用 freopen 后使用 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;
}
4

3 回答 3

2

不建议混合使用 C 和 C++ 来读取文件。它在一开始就可以工作,但似乎通过 seek on 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;
}
于 2014-01-17T03:20:52.127 回答
1

为什么使用frepoen标准输入?

您不应该使用这种方式来混合 Cio 和 C++io。

如果您需要读取外部文件,请使用 fstream。freopen stdio 在这里没有带来好处。

而且,stdin 永远不应该与 fseek 一起使用。fseek 作用于物理存在的文件,但 stdin/stdout 实际上是一个虚拟文件,通常与管道或控制台设备相关联,它们是顺序的,不能搜索到另一个位置。fseek 如何响应取决于文件流属性,这取决于平台,并且可能不会被 freopen 更改。

我测试了你的代码,它在我的系统上运行良好。

于 2014-01-17T03:35:28.580 回答
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;
}
于 2014-01-17T03:48:03.307 回答