如何为c+中的csv文件指定文件目录+;? 我不太擅长C++,但我需要对CSV文件中的数据进行操作。

如何为c+中的csv文件指定文件目录+;? 我不太擅长C++,但我需要对CSV文件中的数据进行操作。,c++,file,csv,directory,ifstream,C++,File,Csv,Directory,Ifstream,文件的格式为天与分类,例如 revenues,profit,volume 481.21,144.36,30 449.13,134.74,28 544.11,163.23,34 368.93,110.68,23 所以第一行指定分类,从第二行开始,再向前,登记第1天、第2天、第3天。。。。等 .cpp.csv和可执行程序位于同一目录中,但我怀疑它没有正确读取我的文件 所以我做了一个简单的测试,并编写了下面几行代码,只是想看看它是否可以将数据打印为天数和分类,

文件的格式为天与分类,例如

    revenues,profit,volume
    481.21,144.36,30
    449.13,134.74,28
    544.11,163.23,34
    368.93,110.68,23
所以第一行指定分类,从第二行开始,再向前,登记第1天、第2天、第3天。。。。等

.cpp.csv和可执行程序位于同一目录中,但我怀疑它没有正确读取我的文件

所以我做了一个简单的测试,并编写了下面几行代码,只是想看看它是否可以将数据打印为天数和分类,但它在任何地方都给了我0

ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
ifstream fin("data.csv");
int days = 1;
double revenues,profit,volume;
while (fin >> revenues >> profit >> volume){
    O[1][days] = revenues;
    O[2][days] = profit;
    O[3][days] = volume;
    days++;
}
for (int t = 1; t <= days; t++){
    for (int i = 1; i <= 3; i++){
        cout << O[i][t] << " ";
    }
    cout << endl;
}
ios\u base::与stdio同步(false);
cin.tie(空);
cout.tie(空);
ifstream fin(“data.csv”);
整数天=1;
收入、利润、数量翻番;
同时(财务>>收入>>利润>>数量){
O[1][天]=收入;
O[2][天]=利润;
O[3][天]=数量;
天++;
}

对于(int t=1;t而言,.cpp文件位于何处并不重要。重要的是.exe文件位于何处(将执行的编译代码)。如果.exe和.csv文件位于同一目录中,则一切正常

你的问题在于你的阅读方式;如果你进行快速调试,你会发现while块从未执行过,因为
(fin>>收入>>利润>>数量)
从第一次开始就会失败。原因是流的提取操作符
>
的工作方式。你可以在任何地方找到更多详细信息(如)。简短的故事:它无法从流中读取double,因为值之间用逗号分隔。它将读取字符串,直到显示空格(包括逗号),并尝试将该字符串解析为double,但它将失败

你应该试着一行一行地读。你把这行分成三个值并使用它们

或者您可以读取字符串直到逗号,然后将这些字符串解析为双值。我提供了一些代码:

string line;

while (fin.good()){
    std::getline (fin, line);
    stringstream line_stream(line);
    string value;

    std::getline (line_stream, value, ',');
    O[1][days] = atof(value.c_str());
    std::getline (line_stream, value, ',');
    O[2][days] = atof(value.c_str());
    std::getline (line_stream, value, ',');
    O[3][days] = atof(value.c_str());
    days++;
}
std::getline()
读取字符串直到换行符或“,”


或者可以简单地在C++中搜索一些专用的CSV库,直接使用它。< /P>请尝试创建一个.记住数组索引是零(即三个元素的数组有索引<代码> 0 < /C> >,<代码> 1 和<代码> 2 < /代码>。您确定您的二进制文件与csv文件也在同一文件夹中吗?请指定错误。它是否打开该文件,或者什么不起作用?无论您的

cpp
文件在哪里或二进制程序在哪里,重要的是您的程序从哪里运行。运行t时,它也是当前的工作目录在“当前”目录中查找文件时,程序是非常重要的。如果您使用的是IDE,则源文件的位置、可执行程序的位置和工作目录可能都不同。打开文件后应检查错误。
If(!fin.is_open())std::这在某种意义上有帮助,因为我确实在数据中找到了数字,但打印出来的版本与实际数据不匹配,例如,1=收入,2=利润,3=数量,然后打印O[2][25]!=第25天的利润,实际上是第31天的收入。@KevvyKim,这可能有多种原因,例如您将数据放入名为“O”的数组的方式或者文件的格式。请添加新版本的代码,并将一些数据作为输入。我刚刚更新了数据的格式。应用与getline类似的概念,但我是否应该包括I的for循环和O[I][days]的days循环?是的。这可能与您将数据放入数组的方式有关。例如,在您发布的代码版本中,读取时,“天”以值50开始。然后,当您打印数据时,从第1天开始。因此,“O”中的元素从0到50不是初始化的,而是打印出来的。不确定你的逻辑是什么,但听起来不太好。哦,该死,那是一个打字错误。最初,天以1开始,因此int days=1;