私は C++ とコーディング全般にかなり慣れていません。Visual Studio 2013 デスクトップを使用して、.CSV ファイルからデータを収集して操作を実行する簡単なプログラムを作成しています。プログラムは正常にコンパイルおよび実行されているようで、開くファイルの名前を入力するように求められます。意図したとおり、無効なファイル名を入力すると、プログラムはエラー メッセージを表示して終了しますが、正しい名前を入力すると、次のようなメッセージが表示されます。
「TestIO.exe の 0x0F16A9E8 (msvcr120d.dll) で未処理の例外: 0xC0000005: 場所 0xCCCCCCC0 を読み取るアクセス違反」。
中断または継続のオプション付き。[続行] を押すと、同じメッセージが再び表示され、[中断] を押してデバッグを停止するまで無限に続きます。ここで何が起こっているのかまったくわかりません。誰かがこれに光を当てることができますか? それは大歓迎です。
編集: これが私の main() です。これがさらに役立つことを願っています。以前に含めなかったことをお詫びします。
int main()
{
int numDays = 0, streams;
string* date;
string line, filename;
DailyData* days;
cout << "Enter file name: ";
getline(cin, filename);
ifstream infile;
infile.open(filename);
if (infile.fail())
{
cout << "Error opening input file" << endl;
return 0;
}
while (getline(infile, line))
numDays++;
date = new string[numDays];
for (int i = 0; i < numDays; i++)
getline(infile, date[i]);
days = new DailyData[numDays];
for (int i = 0; i < numDays; i++)
{
getData(date[i], streams);
days[i] = DailyData(date[i], streams);
}
cout << "Max Streams: " << maxStreams(days, numDays) << endl;
cout << "Min Streams: " << minStreams(days, numDays) << endl;
cout << "Avg Streams: " << average(days, numDays) << endl;
cout << "Tot Streams: " << total(days, numDays) << endl;
delete[] days;
delete[] date;
infile.close();
return 0;
}
編集 2: これは皆さんが求めたものの一部です
void getData(string& d, int& s)
{
int start = 0, end = 0, i = 0;
string p[14];
while (start != string::npos)
{
end = d.find(",", start);
p[i] = d.substr(start, end - start);
start = end + 1;
i++;
}
d = p[0];
s = atoi(p[5].c_str());
}
そして、これがDailyDataとそのコンストラクターです
class DailyData
{
public:
DailyData() :date("NULL"), streams(0){}
DailyData(string d, int s) :date(d), streams(s){}
string getDate(){ return date; }
int getStreams(){ return streams; }
friend ostream& operator << (ostream&, DailyData&);
private:
string date;
int streams;
};
編集 3: 配列の代わりにベクトルを使用するようにコードを変更しました。int main() の変更に加えて、すべての関数定義/宣言で引数を変更するようにしました。最初に発生したのと同じ未処理の例外エラーがまだ発生しています。新しいコード スニペットは次のとおりです。
vector<string> date;
vector<DailyData> days;
//...
while (getline(infile, line))
{
date.push_back(line);
getData(date.back(), streams);
days.push_back(DailyData(date.back(), streams));
}
numDays = days.size();