1

こんにちは、別のファイルからファイル名を読み取ってから読み取ろうとしています。しかし、開きたい 2 番目のファイルの名前を含む最初のファイルしか読み取ることができません。これが私がやっている方法です..

int main()
{
freopen("input1.txt","r",stdin);
while(cin>>fileName>>source>>destination)
{
    //reads perfectly
    char file[100];

    for(int i=0;i<(int)fileName.size();i++)
        file[i] = fileName[i];

    file[(int)fileName.size()] = NULL;        

    freopen(file,"r",stdin);

    mp.clear();
    mp1.clear();

    for(int i=0;i<cityNumber;i++)
        adj[i].clear();
    cityNumber = 0;

    while(cin>>city1>>city2>>distanc)
    {
       //doesn't read
    }
} 
4

3 に答える 3

4

あなたのコードは、過度に複雑な構造を使用しています。単純な C++ の方法で実行してみませんか。

#include <fstream>

int main()
{
std::ifstream input1("input1.txt");
while(input1 >> fileName >> source >> destination)
{
    std::ifstream file(fileName.c_str());

    mp.clear();
    mp1.clear();

    for(int i=0;i<cityNumber;i++)
        adj[i].clear();
    cityNumber = 0;

    while(file >> city1 >> city2 >> distanc)
    {
       //work with values
    }
} 
于 2013-04-23T13:17:11.800 に答える
1

考慮すべき点がいくつかあります。

  • C++ で freopen/fopen ファミリのファイルを使用しないでください (本当に特殊なケースでない限り)。

  • std::iostream を fopen ファミリのファイルと混在させないでください (ここでは freopen を使用しないでください)。

    これらの2つのポイントは、特定のエラーを修正します(@Angewが指摘したように)

  • これにより、100文字を超える読み取りの場合のバッファオーバーフローが回避され(エラーをチェックしないと思います)、コードが簡素化されstd::stringます。std::getlinechar file[100];

  • インデックスによる反復よりも反復子を優先します。

つまり、次の代わりに:

for(int i=0;i < cityNumber;i++)
    adj[i].clear();

あなたは書くことができる/書くべきです:

// C++11
for(auto& city: adj)
    city.clear();

// C++98
for(<type of adj>::iterator city = adj.begin(); city != adj.end(); ++city)
    city->clear();
于 2013-04-23T13:28:57.497 に答える
1

のマニュアルページにfreopenは次のように書かれています:

このfreopen()関数は、が指す文字列の名前を持つファイルを開き、pathstream が指すストリームをそれに関連付けます。元のストリーム (存在する場合) は閉じられます。

したがって、

freopen("input1.txt","r",stdin);

stdinストリームを閉じ、

freopen(file,"r",stdin);

に関連付けるオープン ストリームが見つかりませんfile

おそらくfopen、ファイルをプレーンにして読み込んで、最終的なターゲットに向けinput.txtて出発する必要があります。stdin

于 2013-04-23T13:11:25.353 に答える