【问题标题】:Getting the number of columns and rows of a .csv file in C++在 C++ 中获取 .csv 文件的列数和行数
【发布时间】:2014-04-13 12:24:34
【问题描述】:

我正在尝试编写 C++ 代码以将 .csv 文件中的值输入到 C++ 中的矩阵。 .csv 文件包含浮点值,大小通常 >100x100。 我无法得到否。 .csv 文件中的行和列。它们来自 Matlab 代码,该代码生成大约 10 个不同大小的 .csv 文件。因此,我需要能够自动获取 .csv 文件的大小(以行和列为单位),以便可以在 C++ 代码中删除二维数组。

C++ 代码是:

 #include <fstream>
 #include <vector>
 #include <string>
 #include <sstream>
 #include <stdlib.h>
 #include <iostream>

 /*const int ROWS = 2; 
 const int COLS = 7;*/
 const int BUFFSIZE = 80;

 int main()
 {
     char buff[BUFFSIZE];

     std::ifstream file("file.csv");
     std::string line;
     int col = 0;
     int row = 0;
     int a = 0, b = 0;

     while (std::getline(file, line))
     {
         std::istringstream iss(line);
         std::string result;
         while (std::getline(iss, result, ','))
         {
             col = col + 1;
             std::cout << col;
         }
         row = row + 1;
         std::cout << "\n";
         col = 0;
     }
     float array[row][col];


     while (std::getline(file, line))
     {
         std::istringstream iss(line);
         std::string result;
         while (std::getline(iss, result, ','))
         {
             array[a][b] = atof(result.c_str());
             b = b + 1;
         }
         a = a + 1;
         b = 0;
     }


     for (int i = 0; i < row; i++)
     {
         for (int j = 0; j < col; j++)
         {
             std::cout << array[i][j] << " ";
         }
         std::cout << "\n";
     }
     return 0;
 }

打印循环的输出只是空白。 .csv 文件包含 2x7。我怎样才能解决这个问题?是不是因为istringsteam()getLine() 的多次使用。 请帮忙。请注意,我仍然是 C++ 的初学者。

【问题讨论】:

  • 删除col=0; 声明。代码计算 cols 然后将 cols 设置为零。
  • 您不能将运行时变量用作静态数组维度。您必须动态分配或使用向量:std::vector&lt;std::vector&lt;float&gt;&gt; array(row, std::vector&lt;float&gt;(col))

标签: c++ matlab csv


【解决方案1】:

您可以计算任何行中的逗号数,“count+1”将是 .csv 文件中的列数。

对于行数,你可以简单地写这样的东西 -

int rows=0;
ifstream file("xyz.csv");
string line;
while (getline(file, line))
rows++;

这里的“rows”是 .csv 文件中的行数。

如果需要示例,请查看 this 存储库。

【讨论】:

    【解决方案2】:

    您忘记在第二个循环之前将流的位置向后移动。在最后一个 while() 循环完成后,流到达终点。您现在必须清除错误状态并返回(您也可以关闭并重新打开文件):

    file.clear();
    file.seekg(0, std::ios_base::beg);
    

    此外,您不能将运行时变量用作静态数组维度。如果它支持,您的编译器将使用非标准扩展。您必须动态分配或使用向量:

    std::vector<std::vector<float>> array(row, std::vector<float>(col))
    

    【讨论】:

    • 我不太明白您将运行时变量用作静态数组维度是什么意思。你能详细说明一下吗?另外,我将执行您建议的命令;并发布输出。
    • 用于创建数组的变量应该是const 或字面量(意思是51023 等)。这两种特性都允许在编译时知道它们的值。 C++ 标准不允许变长数组(数组的维度是not const 的变量)。一些编译器的扩展允许你这样做,但它们不符合标准。
    • 我对代码进行了编辑,并已发布。但是,我遇到了错误。两个关于您建议的数组声明说模板参数无效。并且 2 表示该数组未在 main() 的范围内声明
    • @mysticsasuke 请不要使用更新的代码对原始问题进行编辑,这只会使新访问者对您的问题感到困惑。您可以发布更新的代码here 并给我一个链接。
    • @mysticsasuke 但是现在我已经看到你在创建向量时犯了一个错误。您忘记了该类型的第二个结束 &gt;
    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    相关资源
    最近更新 更多