以C++格式将数据从文本文件读取到 3D 矢量中
Reading data from a text file into a 3D vector in C++
为3D数据结构提供简单的基于文本的文件格式:
d d d d d
d d d d d
d d d d d
d d d d d
d d d d d
-
s s s s s
s s s s s
s s s s s
s s s s s
s s s s s
-
g g g g g
g g g g g
g g g g g
g g g g g
g g g g g
-
它表示短字符串的 5x5x3 数据结构。我想知道如何有效地将这些数据加载到std::vector<std::vector<std::vector<std::string>>>
类型的结构中?
到目前为止,我尝试过:
std::ifstream file("file.txt");
std::vector<std::vector<std::vector<std::string>>> data;
int lines = 0;
std::string line;
while(std::getline(file, line)){
std::stringstream stream(line);
if (line.size() > 1){
lines++;
data.resize(lines);
data.back().push_back(std::vector<std::string>());
std::string val;
while(stream >> val){
data.back().back().push_back(val);
}
}
}
这有点有效,尽管只在二维中填充 3D 矢量。我仍然不确定效率。
也许这段代码很糟糕,但它可以完成任务:)代替文件,我使用了std::cin。
#include <iostream>
#include <vector>
#include <string>
int main()
{
const size_t N = 3;
const size_t M = 5;
std::vector<std::vector<std::vector<std::string>>> v;
v.reserve( N );
std::vector<std::vector<std::string>> v2;
v2.reserve( M );
size_t k = 0;
do
{
v2.clear();
std::vector<std::string> v1;
v1.reserve( M );
size_t j = 0;
do
{
v1.clear();
std::string s;
for ( size_t i = 0; i < M && std::cin >> s; i++ )
{
v1.push_back( s );
}
if ( !v1.empty() ) v2.push_back( v1 );
} while ( ++j < M && !v1.empty() );
if ( !v2.empty() ) v.push_back( v2 );
} while ( k < N && ! v2.empty() );
for ( const std::vector<std::vector<std::string>> &v2 : v )
{
for ( const std::vector<std::string> &v1 : v2 )
{
for ( const std::string &s : v1 ) std::cout << s << ' ';
std::cout << std::endl;
}
std::cout << std::endl;
}
return 0;
}
输出为(使用相同的输入):
"d" "d" "d" "d" "d"
"d" "d" "d" "d" "d"
"d" "d" "d" "d" "d"
"d" "d" "d" "d" "d"
"d" "d" "d" "d" "d"
"s" "s" "s" "s" "s"
"s" "s" "s" "s" "s"
"s" "s" "s" "s" "s"
"s" "s" "s" "s" "s"
"s" "s" "s" "s" "s"
"g" "g" "g" "g" "g"
"g" "g" "g" "g" "g"
"g" "g" "g" "g" "g"
"g" "g" "g" "g" "g"
"g" "g" "g" "g" "g"
解决方案变得与我在问题中显示的非常相似。虽然有一些小的修改:
std::ifstream file("file.txt");
std::vector<std::vector<std::vector<std::string>>> data;
data.push_back(std::vector<std::vector<std::string>>());
std::string line;
while(std::getline(file, line)){
std::stringstream stream(line);
if (line.size() > 1){
data.back().push_back(std::vector<std::string>());
std::string val;
while(stream >> val){
data.back().back().push_back(val);
}
}
else {
array_.push_back(std::vector<std::vector<Entity>>());
}
}
要打印结果:
for (auto v1 : data){
for (auto v2 : v1){
for(auto s : v2){
std::cout << s << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
给:
d d d d d
d d d d d
d d d d d
d d d d d
d d d d d
s s s s s
... etc
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 无法将结构注册为增强几何体3D点
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- c++ 从大型数组中读取 3D 坐标并计算它们之间的距离
- 提升program_options:在 3D 矢量中读取作为命令行参数
- 读取 *.mhd/*.raw 在 ITK 中格式化 3D 图像
- 以C++格式将数据从文本文件读取到 3D 矢量中
- 视觉读取列文本数据并在C++中放入 3D 数组
- 从 HDF5 文件读取:将 3D 数据转换为内存中的 1D 矢量
- 插入和读取值从3D地图
- CUDA中作为纹理的3D阵列写入和读取