gpt4 book ai didi

c++ - 从输入文件读取复合键和数值的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 02:46:13 25 4
gpt4 key购买 nike

我正在尝试读取一个由大量字符串组成的文本文件,这些字符串要么代表一个键/值(键是一个汽车号码,格式为字母/''/3位数字/''/2个字母;值是unsigned long long;\t 或 ' ' 之间)或空行,例如:

empty line
empty line
Z 999 ZZ 80
A 000 AA 124
Z 666 ZZ 42

我为此使用 cin.getline() 函数,读取整行并遍历每个字符,将键和值保存到“元素”变量中,然后将其插入 vector 中。但由于某种原因,程序似乎出乎意料地工作,给出了奇怪的输出:

0
0
Z 999 ZZP 80
A 000 AA| 124
Z 666 ZZ* 42

到目前为止,我一直在尝试分析可能出现问题的地方,但我就是看不到它。我还尝试过使用其他工具,如 scanf() 或 cin.get() 但惨败。有人可以向我解释为什么会发生这种情况,并可能展示解决此任务的更正确方法吗?这是代码:

struct kv {
char key[8];
unsigned long long val;
};

int main()
{
std::vector<kv> data_vector;
kv element;

char str[64] = {};
char num[32] = {};
while (std::cin.getline(str, 64)) {
if (str[0] == ' ' || str[0] == '\n' || str[0] == '\t' || str[0] == EOF) {
continue;
}
size_t i = 0, n = 0;
for (i = 0; i < 8; i++)
element.key[i] = str[i];
while (!(str[i] >= '0' && str[i] <= '9'))
i++;
while (str[i] >= '0' && str[i] <= '9')
num[n++] = str[i++];
element.val = atoi(num);
data_vector.push_back(element);
for (n = 0; n < 32; n++)
num[n] = 0;
for (i = 0; i < 64; i++)
str[i] = 0;
}
for (size_t i = 0; i < data_vector.size(); i++) {
std::cout << data_vector[i].key << "\t" << data_vector[i].val << std::endl;
}
return 0;
}

编辑:正如@JimRhodes指出的那样,将 char key[8] 更改为 char key[9] 并添加 element.key[8] = '\0' 有帮助,但是 空行仍然以错误的方式处理(因为它们应该被忽略),输出为 0。

最佳答案

我认为您可能不理解 std::cin.getline() 的工作原理。首先,您不想测试 std::cin.getline() 返回值的 true 或 false。您需要检查 eoffail。其次,std::cin.getline() 会丢弃换行符,因此无需检查 '\n'。你的循环可以这样开始:

for ( ; ; )
{
str[0] = '\0'; // Clear any previous data
std::cin.getline(str, 64);
if ( std::cin.eof() )
{
break; // No more data, exit loop
}
if ( std::cin.fail() || (str[0] < 'A') )
{
continue; // Empty line or line does not start with a letter
}
. . .

关于c++ - 从输入文件读取复合键和数值的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58258128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com