c++ - 数着数。C ++中csv文件中的单词
问题描述
我试图数数。日期存储在 CSV 文件的第一行(以逗号分隔):- State,Region,Lat,Long,1/22/20,1/23/20,1/24/20,1/25/20, 20 年 1 月 26 日我必须数一数。Long 之后的日期(即输出 = 5)。我已经编写了读取 CSV 文件的代码,如下所示,但是,我该如何计算编号。很久以后的日期。非常感谢您的帮助。请随时询问任何其他信息。谢谢。
char** readCSV(const char* csvFileName, int& csvLineCount)
{
ifstream fin(csvFileName);
if (!fin)
{
return nullptr;
}
csvLineCount = 0;
char line[1024];
while(fin.getline(line, 1024))
{
csvLineCount++;
};
char **lines = new char*[csvLineCount];
fin.clear();
fin.seekg(0, ios::beg);
for (int i=0; i<csvLineCount; i++)
{
fin.getline(line, 1024);
lines[i] = new char[strlen(line)+1];
strcpy(lines[i], line);
};
fin.close();
return lines;
}
解决方案
这看起来就像您正在读取包含一个或多个子记录的记录。
我建议使用一个Date
类和一个Record
类。
class Date
{
public:
unsigned int month_num;
unsigned int day_num;
unsigned int year_num;
friend std::istream& operator>>(std::istream& input, Date& d);
};
std::istream& operator>>(std::istream& input, Date& d)
{
char forward_slash;
input >> d.month_num; input >> forward_slash;
input >> d.day_num; input >> forward_slash;
input >> d.year_num;
return input;
}
operator>>
类的重载Date
稍后会派上用场。
现在记录类:
class Record
{
public:
std::string state;
std::string region;
std::string latitude;
std::string longitude;
// A container for the date subrecords
std::vector<Date> dates;
friend std::istream& operator>>(std::istream& input, Record& r);
};
std::istream& operator>>(std::istream& input, Record& r)
{
std::string text_line;
std::getline(input, text_line);
std::istringstream record_stream(text_line);
std::getline(record_stream, r.state, ',');
std::getline(record_stream, r.region, ',');
std::getline(record_stream, r.latitude, ',');
std::getline(record_stream, r.longitude, ',');
Date d;
while (record_stream >> d)
{
r.dates.push_back(d);
char comma;
record_stream >> comma;
}
return input;
}
上面的函数读取输入的文本行,因为记录由换行符终止。从文本行创建一个流。该流有助于读取可变数量的日期。
编辑 1:读取文件
您的输入代码将如下所示:
std::vector<Record> database;
Record r;
while (fin >> r)
{
database.push_back(r);
}
是的,您可以使用 C 字符串和数组,但是 C++ 流式处理和std::vector
简化代码,简单代码比复杂代码的缺陷更少。
此外,std::vector
和std::string
类为您管理动态内存。它们根据需要扩展。无需检查数组溢出。它们也更容易通过。传递数组还需要传递容量(可能还有数组中元素的数量)。
推荐阅读
- jquery - 如何在单击提交按钮时获取所有动态选中的复选框以及文本框值?
- python - 无法理解 return case_of(word)(correct(word.lower())) 的含义
- c++ - Boost IPC - 在共享内存中使用 POD 的 boost::variant 是否安全?
- javascript - OAuth2 请求失败:连接失败 (-2)
- android-jetpack-compose - 如何在 Jetpack Compose 中使用分页器布局?
- javascript - 如何将 axios 发布到数据库?
- java - 准备预览 android 打印管理器
- python - FixedLocator 位置的数量 (11),通常来自对 set_ticks 的调用,与刻度标签的数量 (166) 不匹配 | Matplotlib
- javascript - 组件的 prop 值未显示在 React.js 中
- python - 如何将代码和流程图转换为pdf?