Я пытаюсь прочитать текстовый файл, состоящий из многочисленных строк, которые либо представляют ключ / значение (ключ - это номер машины в формате буквы / '' / 3digits / '' / 2letters; значениедлинная строка без знака; \ t или '' между ними) или пустая строка, например:
пустая строка
пустая строка
Z 999 ZZ 80
A 000 AA 124
Z 666 ZZ 42
Для этого я использую функцию cin.getline (), читая целую строку и просматривая каждый символ,сохранение ключа и значения в переменную 'element' и последующее их добавление в вектор. Но по какой-то причине программа работает неожиданно, выдавая странный вывод:
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, изменив ключ [8] на ключ [9] и добавив element.key [8] = '\ 0 'помогло, , но пустые строки по-прежнему обрабатываются неправильно (как их следует игнорировать), давая вывод 0.