【问题标题】:how can I specify file directory for csv file in c++?如何在 C++ 中为 csv 文件指定文件目录?
【发布时间】:2017-04-17 05:01:39
【问题描述】:

我不太擅长 c++,但我需要对 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;
}

【问题讨论】:

  • 请尝试创建Minimal, Complete, and Verifiable Example。请记住,数组索引是基于 的(即三个元素的数组具有索引 012)。
  • 您确定您的二进制文件也与您的 csv 文件位于同一文件夹中吗?并请说明您的错误。它是打开文件还是什么不起作用?
  • cpp 文件在哪里或 二进制 程序在哪里并不重要,重要的是从哪里运行程序。
  • 当您运行程序时,当前工作目录对于在“当前”目录中查找文件很重要。如果您使用的是 IDE,那么源文件的位置、可执行程序的位置和工作目录可能都不同。
  • 您应该在打开文件后检查错误。 if(!fin.is_open()) std::cout &lt;&lt; std::strerror(errno) &lt;&lt; '\n';

标签: c++ file csv directory ifstream


【解决方案1】:

.cpp 文件的位置并不重要。 .exe 文件的位置很重要(将执行的编译代码)。如果 .exe 和 .csv 文件都在同一个目录下,那就没问题了。

你的问题是你的阅读方式;如果您进行快速调试,您将看到 while 块永远不会执行,因为 (fin &gt;&gt; revenues &gt;&gt; profit &gt;&gt; volume) 从第一次开始就会失败。原因是流的提取运算符&gt;&gt; 的工作方式。您可以在任何地方找到更多详细信息(例如 here)。简短的故事:它无法从流中读取双精度值,因为值是用逗号分隔的。它会读取一个字符串,直到出现一个空格(包括逗号),它会尝试将该字符串解析为双精度值,但它会失败。

您应该尝试逐行阅读。您将线分成三个值并使用它们。

或者您可以读取直到逗号的字符串并将这些字符串解析为双精度值。我已经放了一些代码:

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 库并直接使用它。

【讨论】:

  • 从某种意义上说,这有助于我在数据中找到数字,但打印出来的版本与实际数据不匹配,例如,对于 1 = 收入,2 = 利润,3 = 数量,然后打印 O[2][25] != 第 25 天的利润,实际上是第 31 天的收入。
  • @KevvyKim,这可能有多种原因,例如您将数据放入名为“O”的数组中的方式或文件的格式。请使用一些数据作为输入添加新版本的代码。
  • 我刚刚更新了数据的格式。应用类似的 getline 概念,但我应该为 i 包含 for 循环,为 O[i][days] 包含天数吗?
  • 是的。这可能与您将数据放入数组的方式有关。例如,在您发布的代码版本中,“days”在您阅读时以值 50 开头。然后,当您从第 1 天开始打印数据时。因此,“O”中从 0 到 50 的元素没有被初始化而是被打印出来。不知道你的逻辑是什么,但听起来不太好。
  • 哦该死的,那是一个错字。最初,days 以 1 开头,因此 int days = 1;
猜你喜欢
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 2017-05-05
  • 2013-08-26
相关资源
最近更新 更多