从文件中读取并将其存储在结构中(未正确读取文件)

时间:2014-11-29 15:51:44

标签: c++ excel vector structure

我的代码的问题是在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;
}

1 个答案:

答案 0 :(得分:0)

对于初学者来说,输入的格式似乎不包含所有正在读取的字段。也就是说,输入包含事件ID,名称,开始数据和开始时间的列,但代码还会读取事件类型,死亡,伤害,财产损失,纬度和经度。一旦解决了这个问题,你就会遇到其他不同的问题:

  1. 第一行与您尝试阅读的格式不符。您需要忽略它,例如,使用weather.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  2. 字符串的格式化输入运算符读取单个单词。但是,您的名字由多个单词组成,即只读取这些单词中的第一个单词。我不知道您的文件是否包含合适的分隔符(例如制表符'\t'),您可以使用它来分隔名称或将名称作为固定长度等。你需要一些东西告诉流在哪里停止阅读这个名字。
  3. 使用格式化的输入运算符读入char数组时,应设置读取字符的限制以避免溢出:如果未设置限制,则为将读取许多匹配格式的字符!也就是说,您希望使用以下内容阅读beginDatebeginTime

    weather >> std::setw(sizeof(data.beginDate)) >> data.beginDate
            >> std::setw(sizeof(data.beginTime)) >> data.beginTime;
    

    设置宽度可限制正在读取的数据量。如果有更多字符,输入将失败而不是溢出缓冲区(如果我没记错的话)。

  4. 根据您发布的代码和数据,我发现了这些问题。