ファイルからアイテムに関する情報を読み取るプログラムがあります。問題は、「G ***。DTA」と呼ばれるさまざまなファイルにアイテムが散在していることです(*** =アイテムカテゴリの一意の番号、「G34.DTA」)。C++同じ関数内のさまざまなテキストファイルからの読み取り
これらのファイルを読むには、for-loopを使用してすべてのカテゴリ番号を参照する関数を作成しました。 forループの反復変数は、作成したifstreamオブジェクトのファイル名を作成するために使用されます(第1ラウンドG1.DTA、第2ラウンドG2.DTAなど)。また、すべてのカテゴリにファイルがあるわけではないので、「欠落している」ファイルがいくつかあります。ですから、私のプログラムはG2.DTA、G5.DTA、G10.DTAなどを持つことができます。他のすべてはスキップする必要があります。
とにかく、ファイルから読み込もうとすると、プログラムがハングするだけです。ファイル関数、コンストラクタ、およびファイル形式からの読み込みを含めると、私のミスがどこにあるのか誰にでも見えますか?
この関数は、ファイルから読み込む必要があります。
void Items::readItemsFromFile() {
for(int i = 1; i <= categoryBase->lastCategoryInUse; i++) {
char filename[STRLEN];
char buffer[10];
int nr;
itoa(i, buffer, 10); // Makes category number a char for strcat()
strcpy(filename, "G"); // Makes "G" first part of filename
strcat(filename, buffer); // Makes category number (i) second part of filename
strcat(filename, ".DTA"); // Makes ".DTA" suffix of filename
ifstream infile(filename);
if(infile) {
infile >> nr;
while(!infile.eof()) {
itemList->add(new Item(nr, infile));
infile >> nr;
}
}
}
}
は、ここで(int型nは親クラスNumElementに送信され、項目番号として設定されている)コンストラクタです:
Item::Item(int n, ifstream & in): NumElement(n) {
char buffer[STRLEN];
in.getline(buffer, STRLEN);
salesman = new char[strlen(buffer) + 1]; strcpy(salesman, buffer);
in.getline(buffer, STRLEN);
title = new char[strlen(buffer) + 1]; strcpy(title, buffer);
in.getline(buffer, STRLEN);
description = new char[strlen(buffer) + 1]; strcpy(description, buffer);
in >> startTime >> endTime >> startPrice >> shipping >> increaseBid >> lastBid >> bidTime; in.ignore();
}
そして、ここではどのようですファイル形式は次のようになります:
1
van gogh
summer
beautiful painting
1 2 100 33 5 0 0
3
da vinci
mona lisa
classic
2 3 50 20 3 0 0
'std :: string'はそれほど醜くエラーを起こしやすいでしょう。 –
あなたはC++を書いています。単にstd :: stringを使用しないのはなぜですか?また、charバッファを宣言することが頻繁に繰り返される間違いを、正しいバイト数とみなしています。現在、その文字列がNULLを含むSTRLEN文字以上の場合、メモリ上書きエラーが発生します。 std :: ostringstreamとstd :: stringが使用されていれば、これはすべて問題になる可能性があります。 – PaulMcKenzie