【问题标题】:read .csv file and store into arrays using only <iostream> c++仅使用 <iostream> c++ 读取 .csv 文件并存储到数组中
【发布时间】:2018-02-13 06:45:41
【问题描述】:

您好,我想知道最有效的方法是读取 .csv 文件并将每个逗号分隔的项目存储到其自己的数组或变量中。我只能使用#include &lt;iostream&gt;。我正在考虑使用 .getLine(),但我只知道要存储的分隔符和值,因为不允许使用 &lt;fstream&gt;。话虽这么说,有人知道我该怎么做吗?提前致谢!

这是文件的布局。第一行表示要读取的行数。

输入文件

3
2014,Computer Science,Utah,1568,44.9
2014,Marketing,Michigan,23745,983
215,Business Management, Idaho,256,674

代码:

int year;
char* major = new char[40];//cant be longer than 40 characters
char* state = new char[40]; 
int enrolled;
int rate;
char p;//for cin.get characters possibly

cin>>rows

for(int i = 0; i <= rows; i++){

HMMMMM?

}

【问题讨论】:

  • 您是否尝试过使用getline?这似乎是解决方案的一个很好的开始。您不需要像文件中的号码那样cin
  • 我仍然不明白教授们倾向于对此类作业施加的愚蠢限制(使用流库,但嘿,不是全力以赴,哈哈,傻瓜)。
  • @snipshow7,“高效”不是你应该关心的词。首先,您需要一个数组(或者更好的是,vector)来存储每条记录,它应该是它自己的类。编写一个函数来读取一条记录。编写一个函数,使用第一个函数读取所有记录。
  • 应该直接链接到 stackoverflow.com/questions/1120140/… 重复。
  • 读取文件,不允许fstream。我想这会将文件传送到cin 或使用C 文件处理函数。我想知道fread 变成std::stringstream,然后解析stringstream 会违反规则。

标签: c++ arrays csv iostream


【解决方案1】:

您可以使用也接受分隔符的cin.getline() 函数。至于存储整个 csv 记录,您可以定义一个存储所有字段的结构。

#include <iostream>
#include <cstring>
using namespace std;

typedef struct temp_struct {
    char major[40];
    char state[40];
    float rate;
    int year;
    int enrolled;
} RECORD;

int main() {
    int rows;
    cin >> rows;
    RECORD r[rows];
    char temp[100];
    for(int i = 0; i < rows; i++) {
        cin.getline(temp, 100, ',');
        r[i].year = atoi(temp);

        cin.getline(temp, 100, ',');
        strcpy(r[i].major, temp);

        cin.getline(temp, 100, ',');
        strcpy(r[i].state,temp);

        cin.getline(temp, 100, ',');
        r[i].enrolled = atoi(temp);

        cin.getline(temp, 100);
        r[i].rate = atof(temp);

        cout << r[i].year << " " << r[i].major << " " << r[i].state << " ";
        cout << r[i].enrolled << " " << r[i].rate << endl;
    }
    return 0;
}

对于分隔符,前四个分隔符是,,由于最后一个值rate 后面没有,,而是有一个\n,所以cin.getline() 中没有指定分隔符(因为默认分隔符是\n 本身)。

我已经测试过了;这是链接https://ideone.com/ycht1b

【讨论】:

  • 我想这样做,但你不使用#include 吗?
  • 它也必须全部在main中完成。那么我可以在 main 中以不同的方式使用“temp_struct”吗?
  • @snipshow7,您可以为atoiatof(在cstring 中提供)实现自己的功能,我认为这对您来说是一个很好的练习。此外,您可以使用数组而不是结构。但是,我认为结构更好,因为使用起来更方便(至少对我来说:-P)。
  • 但是 cString 不是 #include 标头吗?
  • 我的意思是说你可以避免将cstring 用于atoiatof。您只需要实现自己的函数即可将char* 转换为intchar* 转换为float
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多