2

私はC ++で以下のようなものを持っています。

何度かファイルを読み込もうとしましたが、失敗しました。

再度 freopen した後、fseek を使用してファイルの先頭に移動しますが、まだ 1 回しか読み取れません。2 回目は、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++ を混在させてファイルを読み取ることは、あまりお勧めできません。最初は機能しますが、をシークすると、常にファイルの最後にあると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

なぜ stdin を 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 に答える