Чтение пространства разделенного файла TXT в массивы C ++ - PullRequest
0 голосов
/ 19 апреля 2020

проблема, с которой я сталкиваюсь, заключается в том, что я должен прочитать значения 7 write 0x01 0x27 из моего файла .txt, и l oop будет работать только 1 раз, давая вывод 0 - 7 1 0x01 0x27 (1 представляет запись, 0 = read, 2 = not set), но значения, которые я распечатал с помощью оператора print, показывают значения как

0 - 7 1 0x30 0x78
1 - 1 2 0x00 0x00 //where the 2 is it reads in 0x27 as a string

Итак, я пытаюсь выяснить, почему он читает дополнительные значения а не только в файле.

void ioLoad(char* name)
{   
    std::ifstream inF;
    inF.open(name, ios_base::in);
    int i = 0;
    string rw;
    while(!inF.eof()){
        inF >> var.time[i]; //int time, from struct 'var'
        inF >> rw;          //string rw, should read either read or write
        inF >> std::hex >> var.address[i] //unsigned char address, from struct 'var' >>PROBLEM LINE<<
        if (rw == "write")
        {
            var.state[i] = WRITE; //stores an enum value as the state
            inF >> std::hex >> var.value[i];  //unsigned char value, from struct 'var' >>PROBLEM LINE<< 
        }
        printf("%d - %d %d 0x%02X 0x%02X\n", i, var.time[i], var.state[i], var.address[i], var.value[i]);
        i++
    }
    inF.close()
}

любая помощь будет принята с благодарностью, и если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

var.address[i] и var.value[i] имеют тип unsigned char. Ваш компилятор обрабатывает символы как числа без знака. Таким образом, строка inF >> std::hex >> var.address[i] читает символы. Вы можете понять это, просто взглянув на таблицу ASCII.

Когда выполняется inF >> std::hex >> var.address[i], ввод равен 0x01, и в него помещается '0', то есть 0x30. Когда выполняется inF >> std::hex >> var.value[i];, вводом является x01 и помещается 'x', то есть 0x78.

Вы можете прочитать в unsigned int tmp

unsigned tmp;
inF >> std::hex >> tmp;
var.address[i] = static_cast<unsigned char>(tmp);
if (rw == "write") {
  var.state[i] = WRITE;
  inF >> std::hex >> tmp;
  var.value[i] = static_cast<unsigned char>(tmp);
}
0 голосов
/ 19 апреля 2020

использование .eof в качестве условия является рискованным делом, как сказал вам парень, комментирующий ваше сообщение, eof работает до последнего чтения, что привело к сбою. это означает, что последнее действие будет выполнено дважды. Вот хороший пост об этом: Почему iostream :: eof внутри условия al oop (то есть `while (! stream.eof ())`) считается неправильным?

там другие параметры, такие как while (file >> data) или проверка, где находится конец файла и выполнение до него.

также обратите внимание, что если вы делаете / n между каждой строкой вашего входного файла, вам нужно «Возьми это», прежде чем продолжить, иначе твое следующее действие по чтению возьмет его вместо того, чтобы взять нужный тебе текст.

...