-2

これはとても簡単な作業のように思えますが、私が試したすべてのことは今のところうまくいきません。

私はファイルを持っていますfoo.txt:

3
3 4 2

ここで、このファイルを読み取り、最初の行を読み取り、最初の行で読み取った数値のサイズで int 配列をインスタンス化します。次に、その配列に 2 行目の要素を入力する必要があります。この行には、まったく同じ量の要素があり、1 行目に記載されています。

4

4 に答える 4

2

サンプルコードを提供する場合は、それを行うための最良の方法も示している可能性があります。

std::ifstream datafile("foo.txt");

if (!datafile) {
    std::cerr << "Could not open \'foo.txt\', make sure it is in the correct directory." << std::endl;
    exit(-1);
}

int num_entries;
// this tests whether the number was gotten successfully
if (!(datafile >> num_entries)) {
    std::cerr << "The first item in the file must be the number of entries." << std::endl;
    exit(-1);
}

// here we range check the input... never trust that information from the user is reasonable!
if (num_entries < 0) {
    std::cerr << "Number of entries cannot be negative." << std::endl;
    exit(-2);
}

// here we allocate an array of the requested size.
// vector will take care of freeing the memory when we're done with it (the vector goes out of scope)
std::vector<int> ints(num_entries);
for( int i = 0; i < num_entries; ++i )
    // again, we'll check if there was any problem reading the numbers
    if (!(datafile >> ints[i])) {
        std::cerr << "Error reading entry #" << i << std::endl;
        exit(-3);
    }
}

デモ (ideone で正しい名前のファイルを提供できないため、小さな変更を加えています): http://ideone.com/0vzPPN

于 2013-10-24T15:55:45.867 に答える
0

cin を使用するのと同じように、ifstream オブジェクトを使用する必要があります。

ifstream fin("foo.txt"); //open the file
if(!fin.fail()){
    int count;
    fin>>count; //read the count
    int *Arr = new int[count];

    for(int i=0;i<count;i++){ //read numbers
        fin>>Arr[i];
    }
    //... do what you need ...

    //... and finally ... 
    delete [] Arr;
} 
于 2013-10-24T15:51:17.767 に答える
0

入力ファイルストリームを使用してファイルを開く場合は、次のように簡単に実行できます。

std::ifstream file_txt("file.txt");

int number_count = 0;
file_txt >> number_count; // read '3' from first line

for (int number, i = 0; i < number_count; ++i) {
      file_txt >> number; // read other numbers
      // process number
}

ファイルストリームは、他の標準ストリーム ( std::cin、 ) と同様に、指定された型(この場合は)std::coutに応じてフォーマットを適用できます。これは、入力と出力の両方に適用されます。operator>>int

于 2013-10-24T15:51:56.617 に答える
0

または、サイズを にロードするだけで、事前にサイズを読み込む必要がなくなりますstd::vector

std::ifstream fin("myfile.txt"); 
std::vector<int> vec{std::istream_iterator<int>(fin), std::istream_iterator<int>()};
fin.close();

または、C++11 構文を使用できない場合:

std::ifstream fin("myfile.txt");
std::vector<int> vec;
std::copy(std::istream_iterator<int>(fin), std::istream_iterator<int>(), std::back_inserter(vec));
fin.close();
于 2013-10-24T16:00:25.373 に答える