C ++将文本文件中的读取到向量中,<vector>然后根据内部向量中的第一个单词写入向量或数组
c++ reading in text file into vector<vector> then writing to vector or array depending on first word in internal vector
这是我发布的问题的进度 C++ 程序用于读取具有恒定(但未知)列数的未知大小的 csv 文件(仅填充浮点数)到数组中.我现在转到真正的应用程序,我在这样的文件中读取:
MESH2D
MESHNAME "default coverage"
NUM_MATERIALS_PER_ELEM 1
E4Q 1 19 20 14 16 2
E4Q 2 17 16 15 23 2
E4Q 3 22 15 14 21 2
E4Q 4 4 3 21 20 1
E4Q 5 6 20 19 7 1
E4Q 6 18 17 10 9 1
E4Q 7 17 23 12 11 1
E4Q 8 7 19 18 8 1
E4Q 9 22 1 13 23 1
E3T 10 14 20 21 2
E3T 11 21 2 22 1
E3T 12 21 3 2 1
E3T 13 22 2 1 1
E3T 14 5 20 6 1
E3T 15 20 5 4 1
E3T 16 16 14 15 2
E3T 17 23 13 12 1
E3T 18 22 23 15 2
E3T 19 17 11 10 1
E3T 20 17 18 16 2
E3T 21 8 18 9 1
E3T 22 18 19 16 2
ND 1 -3.25811078e+002 7.70285567e+001 0.00000000e+000
ND 2 -3.24209146e+002 7.60394871e+001 0.00000000e+000
ND 3 -3.23012110e+002 7.44783503e+001 0.00000000e+000
ND 4 -3.22754089e+002 7.25326647e+001 0.00000000e+000
ND 5 -3.23617358e+002 7.08079432e+001 0.00000000e+000
ND 6 -3.25161538e+002 6.98134116e+001 0.00000000e+000
ND 7 -3.27128620e+002 6.98759747e+001 0.00000000e+000
ND 8 -3.29095703e+002 6.99385378e+001 0.00000000e+000
ND 9 -3.30301095e+002 7.14667646e+001 0.00000000e+000
ND 10 -3.30786908e+002 7.33241555e+001 0.00000000e+000
ND 11 -3.30835733e+002 7.52916270e+001 0.00000000e+000
ND 12 -3.29587322e+002 7.65401204e+001 0.00000000e+000
ND 13 -3.27743000e+002 7.72270000e+001 0.00000000e+000
ND 14 -3.26108525e+002 7.32067724e+001 0.00000000e+000
ND 15 -3.27041416e+002 7.42070316e+001 0.00000000e+000
ND 16 -3.27350377e+002 7.31716751e+001 0.00000000e+000
ND 17 -3.29153676e+002 7.40024406e+001 0.00000000e+000
ND 18 -3.28659180e+002 7.19967464e+001 0.00000000e+000
ND 19 -3.26845856e+002 7.14062637e+001 0.00000000e+000
ND 20 -3.25000347e+002 7.20534611e+001 0.00000000e+000
ND 21 -3.24701329e+002 7.39638966e+001 0.00000000e+000
ND 22 -3.26167714e+002 7.53360591e+001 0.00000000e+000
ND 23 -3.28060316e+002 7.54194849e+001 0.00000000e+000
BEGPARAMDEF
GM "Mesh"
SI 0
DY 0
TU ""
TD 0 0
NUME 3
BCPGC 0
DISP_OPTS entity 0 0 0 0 1 0 0 0
DISP_OPTS inactive 0 0 0 0 1 0 0 0
DISP_OPTS multiple 0 0 0 0 1 0 0 0
BEFONT 0 1
DISP_OPTS entity 1 0 0 0 1 0 0 0
DISP_OPTS inactive 1 0 0 0 1 0 1 0
DISP_OPTS multiple 1 0 0 0 1 0 1 0
BEFONT 1 1
DISP_OPTS entity 2 0 0 0 1 0 0 0
DISP_OPTS inactive 2 0 0 0 1 0 1 0
DISP_OPTS multiple 2 0 0 0 1 0 1 0
BEFONT 2 1
MAT 1 "material 01"
MAT 2 "material 02"
MAT_MULTI 0
ENDPARAMDEF
BEG2DMBC
END2DMBC
BEGCURVE Version: 1
ENDCURVE
称为"example.2dm",并尝试为存储在以 E4Q E3T 和 ND 开头的行中的数据编写 3 个 2D 向量(或可能(最好)数组)。我想使用这些单元格定义来打印带有单元格中心的文件。
我认为这种问题在这里记录非常有用,因为我的最后一个问题不断获得观点。
到目前为止,我的代码是:
// Read in CSV
//
// Alex Byasse
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
#include <cstdlib>
enum case_name {e3t, e4q, nd};
case_name checkit(std::string const& inString)
{
if (inString == "E3T") return e3t;
if (inString == "E4Q") return e4q;
if (inString == "ND") return nd;
}
int main()
{
std::vector<std::vector<std::string>> values;
std::ifstream fin("example.2dm");
for (std::string line; std::getline(fin, line); )
{
std::istringstream in(line);
values.push_back(
std::vector<std::string>(std::istream_iterator<std::string>(in),
std::istream_iterator<std::string>()));
}
int nc = 0;
int nn = 0;
std::vector<std::vector<double>> cells;
std::vector<std::vector<double>> nodes;
for (int i = 0; i < values.size() - 1; i++) {
switch (checkit(values[i][0])){
case e3t:
cells[nc].push_back(std::stod(values[i][1]));
cells[nc].push_back(std::stod(values[i][2]));
cells[nc].push_back(std::stod(values[i][3]));
cells[nc].push_back(std::stod(values[i][4]));
cells[nc].push_back(std::stod(values[i][2]));
cells[nc].push_back(std::stod(values[i][5]));
nc++;
break;
case e4q:
cells[nc].push_back(std::stod(values[i][1]));
cells[nc].push_back(std::stod(values[i][2]));
cells[nc].push_back(std::stod(values[i][3]));
cells[nc].push_back(std::stod(values[i][4]));
cells[nc].push_back(std::stod(values[i][5]));
cells[nc].push_back(std::stod(values[i][6]));
nc++;
break;
case nd:
nodes[nn].push_back(std::stod(values[i][1]));
nodes[nn].push_back(std::stod(values[i][2]));
nodes[nn].push_back(std::stod(values[i][3]));
nn++;
break;
}
}
}
我可以得到一些帮助来修复此代码吗?这是对的吗?
#include <cstdlib>
我收到以下编译错误:
$ g++ read_csv2.cpp -std=c++0x
read_csv2.cpp: In function ‘int main()’:
read_csv2.cpp:44:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:45:33: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:46:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:47:33: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:48:33: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:49:33: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:53:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:54:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:55:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:56:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:57:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:58:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:62:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:63:26: error: ‘stod’ is not a member of ‘std’
read_csv2.cpp:64:26: error: ‘stod’ is not a member of ‘std’
我在cygwin上运行g++。我已经检查了手册页,-std=c++11 是一个可用的选项,我已经尝试过了,但我得到了同样的错误?
您的程序会产生很多编译错误。我建议你花更多的时间阅读C++和STL的基础知识。
-
std::vector<std::vector<std::string>> values;
std::vector<std::vector<std::string> > values;
.请注意区别,一些C++编译器会将>>
作为正确的移位运算符。 -
在代码中的许多地方,您只使用了
vector
而不是std::vector
。更正此问题或考虑在 main 函数之前添加using namespace std;
。 -
double
是基元类型。没有什么叫做std::double
. -
将
vector::size(values)-1
更改为values.size() - 1
。 -
使用
;
而不是,
分隔for
语句的三个部分。 -
switch values[i][0]
应该是switch (values[i][0])
. -
E3T
是一个字符串,因此您使用"E3T"
而不是'E3T'
。单引号用于字符。 -
而且C++不支持使用字符串
switch
,因此请改用if-else-if
。
有cells[nc]
和nodes[nd]
的位置被破坏,因为这些向量的大小永远不会增加。
这里有一些东西可以做你需要的,而不需要std::stod
。 我将其更改为使用 ND 行中的所有值,假设这就是您的意思,如果不是,请在该 GetValues 调用中将 4 更改为 3。
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
#include <cstdlib>
double ToDouble(const std::string& str)
{
std::stringstream s(str);
double d;
s >> d;
return d;
}
std::vector<double> GetValues(const std::vector<std::string>& src, int start, int end)
{
std::vector<double> ret;
for(int i = start; i <= end; ++i)
{
ret.push_back(ToDouble(src[i]));
}
return ret;
}
void PrintValues(const std::string& title, std::vector<std::vector<double>>& v)
{
std::cout << title << std::endl;
for(size_t line = 0; line < v.size(); ++line)
{
for(size_t val = 0; val < v[line].size(); ++val)
{
std::cout << v[line][val] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
int main()
{
std::vector<std::vector<std::string>> values;
std::ifstream fin("example.2dm");
for (std::string line; std::getline(fin, line); )
{
std::istringstream in(line);
values.push_back(
std::vector<std::string>(std::istream_iterator<std::string>(in),
std::istream_iterator<std::string>()));
}
std::vector<std::vector<double>> cells;
std::vector<std::vector<double>> nodes;
for (size_t i = 0; i < values.size(); ++i)
{
if(values[i][0] == "E3T")
{
cells.push_back(GetValues(values[i], 1, 5));
}
else if(values[i][0] == "E4Q")
{
cells.push_back(GetValues(values[i], 1, 6));
}
else if(values[i][0] == "ND")
{
nodes.push_back(GetValues(values[i], 1, 4));
}
}
PrintValues("Cells", cells);
PrintValues("Nodes", nodes);
return 0;
}
std::stod
问题很奇怪,我认为这在Cygwin上起作用。 如果你用-std=c++11
编译这个程序会发生什么?
#include <string>
#if __cplusplus < 201103L
#warning No C++11 support
#endif
#if !defined(_GLIBCXX_USE_C99)
#warning No C99 library functions
#endif
#if defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
#warning Broken vswprintf
#endif
int main() { }
这些是libstdc++定义std::stod
所需的预处理器条件,因此如果编译产生任何警告,那么您将无法使用std::stod
。您可能需要改用strtod(values[i][3].c_str(), nullptr)
。
- C++:如何读取分离变量,然后读取向量
- 如何正确地推回然后遍历堆中对象的向量?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 有没有办法搜索向量的元素,<String>然后检查它是否包含特定的字符,如果它确实打印了它
- C++:将向量传递给函数,然后在main中调用函数.错过了什么
- C++ 按数值对元组<字符串、浮点数>然后按字典顺序排序的向量
- 在结构向量中搜索一个数据成员,然后打印匹配的所有数据成员
- 如何在每次循环迭代期间生成向量,存储数据,然后删除该向量?
- 将整数向量转换为字节数组向量,然后调用每个字节数组
- C++ std::vector 创建对象然后添加对象与在向量中创建对象之间的区别?
- 我可以在中断中写入向量,然后以安全的方式仅在主线程内读取吗?
- 制作一个对的向量,对其进行排序,然后从中提取向量
- 根据标准对结构向量进行排序,然后显示结果
- C - 将文本文件读为一串单词,然后将字符串分为向量
- 为什么我的将向量保存到文件然后再次读出的方法不起作用?
- 我有不同的类,我想用这些类中的对象制作一个向量,然后按值对其进行排序
- remove_if然后擦除对向量有效吗
- 如何在C++中创建一个网格,这将允许我将每个索引设置为一个向量,以便以后操作该向量,然后绘制它
- 如何使用选择语句检索 sqlite 并分配给向量然后分配给字符串