我的代码的问题是在while循环中,程序没有正确读取文件中的数据。如果我要从while循环中输出结构的每个单独成员,它会将零,空白甚至随机数等内容输出到结构的不同成员。这也意味着没有任何东西被添加到向量中,因为向量大小为零。
注1 - 我使用代码块作为我的IDE。
注意2 - 我正在使用的文件是excel文件。这意味着我假设您之前使用过excel文件并且知道它们在列和行中排成一行。此外,我只希望在结构中的每个成员都有一定数量的数据。
这是我输入文件中的一个非常小的样本。
EVENT_ID CZ_NAME_STR BEGIN_DATE BEGIN_TIME
9991511 MIAMI-DADE CO. 10/18/1955 800
9991516 MIAMI-DADE CO. 4/10/1956 1730
9991517 MIAMI-DADE CO. 4/10/1956 1730
这是我的代码
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <string>
using namespace std;
// Structure.
struct Weather_Event
{
int eventID; // is the unique int id associated with the weather event.
string CZ_NAME; // is the location associated with the weather event.
char beginDate[11]; // is the date the event started.
char beginTime[5]; // is the time the event started.
string eventType; // is the type of weather event.
int deaths; // are the number of people killed by the weather.
int injuries; // are the number of people injured by the event.
int propertyDamage; /* is the $ worth of property damage caused
by the event. */
float beginLatitude; // is the starting latitude for the event.
float beginLongitude; // is the starting longitude for the event.
};
int main()
{
// Create an empty vector that will contain the structure.
vector<Weather_Event>weatherInformation(0);
Weather_Event data; /* Create an object to access each member in
the structure. */
// Declare an object and open the file.
ifstream weather("weatherdata.csv");
if(!weather) // Check to see if the file opens.
{
cerr << "Error, opening file. ";
exit(EXIT_FAILURE); // terminate the program early.
}
/* While you're not at the end of the file, keep reading each new
piece of data. */
while(weather >> data.eventID >> data.CZ_NAME >> data.beginDate
>> data.beginTime >> data.eventType >> data.deaths
>> data.injuries >> data.propertyDamage >> data.beginLatitude
>> data.beginLongitude)
{
/* Add all the data that was added to each member of the
structure, into the vector. */
weatherInformation.push_back(data);
}
weather.close();
// Next display the result
for(size_t i=0; i<weatherInformation.size(); i++)
{
cout << "EventID: " << weatherInformation[i].eventID << endl;
}
return 0;
}
答案 0 :(得分:0)
对于初学者来说,输入的格式似乎不包含所有正在读取的字段。也就是说,输入包含事件ID,名称,开始数据和开始时间的列,但代码还会读取事件类型,死亡,伤害,财产损失,纬度和经度。一旦解决了这个问题,你就会遇到其他不同的问题:
weather.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
'\t'
),您可以使用它来分隔名称或将名称作为固定长度等。你需要一些东西告诉流在哪里停止阅读这个名字。使用格式化的输入运算符读入char
数组时,应设置读取字符的限制以避免溢出:如果未设置限制,则为将读取许多匹配格式的字符!也就是说,您希望使用以下内容阅读beginDate
和beginTime
:
weather >> std::setw(sizeof(data.beginDate)) >> data.beginDate
>> std::setw(sizeof(data.beginTime)) >> data.beginTime;
设置宽度可限制正在读取的数据量。如果有更多字符,输入将失败而不是溢出缓冲区(如果我没记错的话)。
根据您发布的代码和数据,我发现了这些问题。