istringstream >>运算符产生意外行为

istringstream >> operator yielding unexpected behavior

本文关键字:gt 意外 运算符 istringstream      更新时间:2023-10-16

我一直在用 c++ 编写一个程序,该程序将从我编写的 python 程序中获取一些数据,我使用 python 是因为使用来自 istringstream 变量的>> 运算符格式化数据以便在 c++ 中使用要快得多。

我的python程序必须将两个单独的文件合并在一起,通过时间戳排序来合并它们,然后打印出生成的排序数组。我使用输出重定向将打印的输出捕获到文件中。然后,我将使用 c++ 程序对该文件进行操作。

RC 1548997200000 apple 4
RQ 1549003500000 banana 4

这里的想法是,我将利用这些格式化的数据,如上C++所示。

我使用了这样的东西:

std::string name, type, line;
int score, timeStamp;
while (std::getline(std::cin, line)) {
std::istringstream SS(line);
SS >> type >> timeStamp >> name >> score;

在 Visual Studio 调试器中运行此代码时,我发现类型字符串变量正确接收其值,例如"RC"和"RQ",但 timeStamp 变量未正确接收其输入,名称或分数也没有。SS 字符串流正确表示重定向的输入,行字符串变量也正确。

我做了一些基本的测试,取出了时间戳和前后的两个空格,然后输入一个空格为零,最后一个空格,因此第一行是这样的:"RC 0 apple 4",令我惊讶的是,我所有的变量都正确地接收了它们应该的输入。

所有这些都使我相信我的文件中存在编码错误。我在没有时间戳合并的情况下执行此操作,然后一旦我开始使用时间戳,这个问题就开始发生。

任何帮助,不胜感激。

您正在使用毫秒时间戳值,这些值远远超出了正常int可以存储的范围。考虑使用int64_tlong long int,以提供所需的范围。

您应该考虑的一件事是使用现有的std::cin流,而不是读出一行,将该行转换为流,然后从中读取。

问题来自时间戳的类型。时间戳有 13 位数字,但 c++ 中的int类型最多只能存储 10 位数字。尝试长 long int

请参阅问题整数类型可以存储在哪些值范围C++ 和C++:存储 13 位数字总是无法获取更多详细信息。

其他人正在处理类似的问题,代码可能会为您提供更多信息: C++ 使用字符串流从字符串中提取 int。