gpt4 book ai didi

C++读取csv文件并将值分配给数组

转载 作者:行者123 更新时间:2023-11-30 01:35:50 26 4
gpt4 key购买 nike

我正在尝试读取 csv 文件并将值分配给二维数组,但我得到了奇怪的结果和一些垃圾值。虽然第一行是正确的,但第二行和第三行就变得奇怪了。

下面是代码:

#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
ifstream myFile;
myFile.open("test.csv");

int _data[3][3];
int i = 0;
int j = 0;

while (myFile.good())
{
string line;
getline(myFile, line, ',');

_data[i][j] = stoi(line);
j++;
if (j > 3) {
i++;
j = 0;
}
}

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout << _data[i][j] << " ";
}
cout << endl;
}
}

我创建了一个 csv 文件,其中包含以下数据:

1,1,1
1,2,3
3,1,3

我从代码中得到的输出结果是:

1 1 3
3 1 3
-858993460 -858993460 -858993460

我想看看我的循环是否出错,但对我来说似乎很好。

最佳答案

使用固定数组而不是vector会让事情变得更加困难。的vector<int>对于你的二维数组。此外,用于解析 .csv文件,读取每个完整行,然后创建 stringstream从行中解析 getline使用','终结符,然后使用 stoi将字段转换为整数值 (C++11) 使过程非常简单。

例如,将要读取的文件名作为程序的第一个参数,您可以将上面的代码实现为:

#include <iostream>
#include <fstream>
#include <sstream>

#include <string>
#include <vector>

using namespace std;

int main (int argc, char **argv) {

string line; /* string to hold each line */
vector<vector<int>> array; /* vector of vector<int> for 2d array */

if (argc < 2) { /* validate at least 1 argument given */
cerr << "error: insufficient input.\n"
"usage: " << argv[0] << " filename\n";
return 1;
}

ifstream f (argv[1]); /* open file */
if (!f.is_open()) { /* validate file open for reading */
perror (("error while opening file " + string(argv[1])).c_str());
return 1;
}

while (getline (f, line)) { /* read each line */
string val; /* string to hold value */
vector<int> row; /* vector for row of values */
stringstream s (line); /* stringstream to parse csv */
while (getline (s, val, ',')) /* for each value */
row.push_back (stoi(val)); /* convert to int, add to row */
array.push_back (row); /* add row to array */
}
f.close();

cout << "complete array\n\n";
for (auto& row : array) { /* iterate over rows */
for (auto& val : row) /* iterate over vals */
cout << val << " "; /* output value */
cout << "\n"; /* tidy up with '\n' */
}
return 0;
}

(注意: stringvector 提供的自动内存管理将允许您读取任何大小的数组(最多达到虚拟内存的限制),而无需知道数量预先包含字段或行。您可以添加简单的计数器来验证每行包含相同数量的值等...)

输入文件示例

$ cat file.txt
1,1,1
1,2,3
3,1,3

示例使用/输出

$ ./bin/iostream_sstream_csv_stoi file.txt
complete array

1 1 1
1 2 3
3 1 3

仔细检查一下,如果您还有其他问题,请告诉我。

关于C++读取csv文件并将值分配给数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53148332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com