读取/解析文本文件输入 C++

Gad*_*ion 2 c++ input

一点背景:我正在为一个学校项目开发一个滑块拼图,这是我们第一次使用 C++ 而不是 Java。这是我第一次必须实现从文件中读取数据的东西。

我有一个关于从文本文件读取输入的简单问题。我了解如何逐行读取文件并将每一行保存在一个字符串中,我想知道是否可以在读取文件时将字符串解析为不同的数据类型。

目前我正在阅读每一行并将它们作为字符串存储在向量中以供稍后解析,我知道必须有一种更简单的方法来实现这一点

第一行包含 2 个整数,表示网格的长度和宽度,接下来的行将包含 4 个整数和一个字符,用作创建块时的参数。

我的问题是,如果我一个字符一个字符地读取文件,是否有一个我可以使用的函数来检测字符是整数还是字符(并忽略空格),以便我可以立即存储它们并创建块读取文件时的对象?在这种情况下,我将如何处理大于 10 的整数?

编辑:只是注意到我使用 fstream 来读取文件,我不熟悉其他输入法

示例输入:

4  4
3  1  2  1  b
1  1  1  1  a 
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

要检测一段字符串是否可以解析为整数,您只需解析它并查看是否成功。最好的功能可能是std::strtoul(),因为它可以告诉您它消耗了多少个字符,以便您可以在此之后继续解析。(有关详细信息,请参阅手册页。)

但是,如果您已经知道文件的格式,则可以使用 iostream 格式提取。这很简单:

#include <fstream>


std::ifstream infile("thefile.txt");

int n1, n2, x1, x2, x3, x4;
char c;

if (!(infile >> n1 >> n2)) { /* error, could not read first line! Abort. */ }

while (infile >> x1 >> x2 >> x3 >> x4 >> c)
{
    // successfully extracted one line, data is in x1, ..., x4, c.
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是将每一行读入一个字符串(使用std::getline),然后从该行创建一个字符串流,并使用>>. 这有一个额外的好处,您可以发现并跳过坏行并恢复,而在我上面介绍的直接格式化提取中,您无法从任何错误中恢复。