使用仅限于<iostream>的C++,读取.csv文件并将其存储到数组中

3
你好,我想知道读取.csv文件并将每个逗号分隔的项存储到各自的数组或变量中最有效的方法是什么。我只能使用#include <iostream>。我考虑过使用.getLine(),但我只会知道定界符和值要存储,因为不允许使用<fstream>。话虽如此,有人知道我该如何解决吗?谢谢!

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

输入文件

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 - Paul Rooney
我仍然不理解教授们倾向于对这些作业施加的愚蠢限制(使用流库,但是嘿,并不是完全使用它的功能,哈哈,笨蛋)。 - Dúthomhas
1
@snipshow7,“高效”并不是你应该关心的词。首先,你需要一个数组(或更好的是_vector_)来存储每个记录,每个记录应该拥有自己的类。编写一个函数来读取单个记录。编写一个使用第一个函数来读取所有记录的函数。 - Dúthomhas
应该将其链接到 https://dev59.com/-XNA5IYBdhLWcg3wBpDs 作为重复问题。 - Dúthomhas
读取文件,不允许使用 fstream。我猜只能通过将文件传输到 cin 或使用 C 文件处理函数来完成。我想知道是否将 freadstd::stringstream 中,然后解析 stringstream 是否违反规则。 - user4581301
不能使用向量。是的,我在考虑getLine()。但是对于流大小int getLine(char* s,streamsize n,char delim),我该怎么办? - snipshow7
1个回答

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 <cstring> 吗? - snipshow7
它也必须全部在主函数中完成。那么我能否在主函数中以不同的方式使用“temp_struct”呢? - snipshow7
@snipshow7,你可以自己实现cstring中的atoiatof函数,我认为这将是一个很好的练习。此外,你可以使用数组代替结构体。但是,我认为结构体更好,因为使用它们更方便(至少对我来说是这样的 :-P)。 - kiner_shah
但是cString不是一个#include头文件吗? - snipshow7
我的意思是说,你可以避免使用 cstring 来进行 atoiatof 操作。你只需要自己实现将 char* 转换为 int 和将 char* 转换为 float 的函数即可。 - kiner_shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接