如何将文本文件读入二维矢量?
How do I read a text file into a 2D vector?
我们将感谢您的帮助。
我必须将一个包含行和列的文本文件读入向量。文本文件可以是任何大小。
文本文件示例之一:
T,T,T,F,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
现在,如何将此文本文件上传到二维矢量上?
到目前为止,我知道我必须使用向量的向量(2d 向量),所以我这样初始化它:
vector<vector<char> > forest;
老实说,我不知道如何从这里前进。我假设我必须使用嵌套的 for 循环,但我对 2d 向量没有太多练习。
我也在考虑使用 getline 并将每一行作为字符串读取,或者使用 .get 函数并将每个字符视为 while 循环中的字符?我是编码工作的新手,所以我们将不胜感激!
谢谢:)
您可以使用getline
将文件逐行读入字符串。对于您读取的每个字符串,迭代其字符以构建行向量来填充您的森林:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
int main() {
std::string line;
std::ifstream infile("file.txt");
std::vector<std::vector<char> > forest;
while (std::getline(infile, line)) {
std::vector<char> row;
for (char &c : line) {
if (c != ',') {
row.push_back(c);
}
}
forest.push_back(row);
}
for (std::vector<char> &row : forest) {
for (char &c : row) {
std::cout << c << ' ';
}
std::cout << '\n';
}
return 0;
}
输出:
T T T F T
T T T T T
T T T T T
T T T T T
T T T T T
T T T T T
T T T T T
要解决诸如此类的编程问题,一种有效的方法是将其分解为更小的问题,然后编写函数来解决每个问题。
在这个特定的问题中,我们可以考虑将问题分解如下
- 逐行读取文件内容。
- 用一些分隔符分隔每一行,在这种特殊情况下,
,
字符。
- 将此结果存储在输出数据结构中,即
std::vector<std::vector<char>>
。
我们可以编写一个函数来解决问题 1,而不是简单地使用 C++,使用 ifstream
和 getline
,即
#include <fstream>
#include <string>
std::vector<std::vector<char>> read_char_matrix(std::string const &filename) {
std::ifstream infile(filename);
for (std::string line; std::getline(infile, line); ) {
// Add stuff into a matrix
}
// Return the matrix
}
因此,有了读取文件内容的解决方案,我们现在可以考虑问题 2。花点时间了解问题 2 实际上是一个独立的问题,它只需要分解一个comma-separated 字符串。使用 istringstream
可以通过一些定界符拆分字符串。我们可以单独写一个函数来实现,如下
#include <sstream>
#include <vector>
std::vector<char> split_on(std::string const &str, char delimiter) {
std::istringstream iss(str);
std::vector<char> split_str;
for (char c; iss >> c; ) {
split_str.emplace_back(c);
// Ignore delimiters
if (iss.peek() == delimiter)
iss.ignore();
}
return split_str;
}
最后,我们可以将其合并为以下解决方案
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
std::vector<char> split_on(std::string const &str, char delimiter) {
std::istringstream iss(str);
std::vector<char> split_str;
for (char c; iss >> c; ) {
split_str.emplace_back(c);
// Ignore delimiters
if (iss.peek() == delimiter)
iss.ignore();
}
return split_str;
}
std::vector<std::vector<char>> read_char_matrix(std::string const &filename) {
std::ifstream infile(filename);
std::vector<std::vector<char>> matrix;
for (std::string line; std::getline(infile, line); ) {
matrix.emplace_back(split_on(line, ','));
}
return matrix;
}
然后可以使用文件名调用函数 read_char_matrix
并将 return 中的预期矩阵 std::vector<std::vector<char>>
.
我们将感谢您的帮助。
我必须将一个包含行和列的文本文件读入向量。文本文件可以是任何大小。 文本文件示例之一:
T,T,T,F,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
T,T,T,T,T
现在,如何将此文本文件上传到二维矢量上?
到目前为止,我知道我必须使用向量的向量(2d 向量),所以我这样初始化它:
vector<vector<char> > forest;
老实说,我不知道如何从这里前进。我假设我必须使用嵌套的 for 循环,但我对 2d 向量没有太多练习。
我也在考虑使用 getline 并将每一行作为字符串读取,或者使用 .get 函数并将每个字符视为 while 循环中的字符?我是编码工作的新手,所以我们将不胜感激!
谢谢:)
您可以使用getline
将文件逐行读入字符串。对于您读取的每个字符串,迭代其字符以构建行向量来填充您的森林:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
int main() {
std::string line;
std::ifstream infile("file.txt");
std::vector<std::vector<char> > forest;
while (std::getline(infile, line)) {
std::vector<char> row;
for (char &c : line) {
if (c != ',') {
row.push_back(c);
}
}
forest.push_back(row);
}
for (std::vector<char> &row : forest) {
for (char &c : row) {
std::cout << c << ' ';
}
std::cout << '\n';
}
return 0;
}
输出:
T T T F T
T T T T T
T T T T T
T T T T T
T T T T T
T T T T T
T T T T T
要解决诸如此类的编程问题,一种有效的方法是将其分解为更小的问题,然后编写函数来解决每个问题。
在这个特定的问题中,我们可以考虑将问题分解如下
- 逐行读取文件内容。
- 用一些分隔符分隔每一行,在这种特殊情况下,
,
字符。 - 将此结果存储在输出数据结构中,即
std::vector<std::vector<char>>
。
我们可以编写一个函数来解决问题 1,而不是简单地使用 C++,使用 ifstream
和 getline
,即
#include <fstream>
#include <string>
std::vector<std::vector<char>> read_char_matrix(std::string const &filename) {
std::ifstream infile(filename);
for (std::string line; std::getline(infile, line); ) {
// Add stuff into a matrix
}
// Return the matrix
}
因此,有了读取文件内容的解决方案,我们现在可以考虑问题 2。花点时间了解问题 2 实际上是一个独立的问题,它只需要分解一个comma-separated 字符串。使用 istringstream
可以通过一些定界符拆分字符串。我们可以单独写一个函数来实现,如下
#include <sstream>
#include <vector>
std::vector<char> split_on(std::string const &str, char delimiter) {
std::istringstream iss(str);
std::vector<char> split_str;
for (char c; iss >> c; ) {
split_str.emplace_back(c);
// Ignore delimiters
if (iss.peek() == delimiter)
iss.ignore();
}
return split_str;
}
最后,我们可以将其合并为以下解决方案
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
std::vector<char> split_on(std::string const &str, char delimiter) {
std::istringstream iss(str);
std::vector<char> split_str;
for (char c; iss >> c; ) {
split_str.emplace_back(c);
// Ignore delimiters
if (iss.peek() == delimiter)
iss.ignore();
}
return split_str;
}
std::vector<std::vector<char>> read_char_matrix(std::string const &filename) {
std::ifstream infile(filename);
std::vector<std::vector<char>> matrix;
for (std::string line; std::getline(infile, line); ) {
matrix.emplace_back(split_on(line, ','));
}
return matrix;
}
然后可以使用文件名调用函数 read_char_matrix
并将 return 中的预期矩阵 std::vector<std::vector<char>>
.