Чтение двоичного файла на SD-карте

Почему я не могу прочитать последний байт файла, когда использую код Arduino ide? Код в cpp работает без ошибок. Это мой код в Arduino ide:

  vector<unsigned char> text;
  unsigned char textseg;
  in_file.read(&textseg,1);
  while (in_file.available()){ 
      text.push_back(textseg);
      in_file.read(&textseg,1);
  }

А это код cpp:

vector<unsigned char> text;
unsigned char textseg;
in_file.read(reinterpret_cast<char*>(&textseg), 1);
while (!in_file.eof())
{   text.push_back(textseg);
    in_file.read(reinterpret_cast<char*>(&textseg), 1);
} 

, 👍2

Обсуждение

Я предполагаю, что разница вызвана другим объявлением in_file. Но поскольку вы не показываете нам декларацию, это всего лишь предположение. Это также вызвано тем, что вы читаете последнюю строку, но не записываете ее в текстовый вектор, потому что цикл with не входит в цикл, когда читается последний символ. У меня нет объяснения, почему этого не происходит во втором случае. Возможно, потому, что eof срабатывает только тогда, когда метод чтения читает из пустого потока, и доступный знает, что поток пуст, без повторного чтения из него., @Peter Paul Kiefer

потому что ты это читаешь, но не пишешь. у вас есть чтение перед циклом while, но нет записи после цикла while. available() возвращает количество байтов, доступных для чтения. eof() верен, когда вы пытаетесь прочитать больше, чем длина файла., @Juraj

Знаете ли вы, что feof() возвращает true только **после** того, как вы попытались прочитать конец файла?, @the busybee


1 ответ


1

Похоже, что ваш цикл выходит за один. Я бы предпочел:

  vector<unsigned char> text;
  unsigned char textseg;
  while (in_file.available()){ 
      in_file.read(&textseg,1);
      text.push_back(textseg);
  }

Зачем читать байт, как вы это сделали, прежде чем узнать, доступен ли он?

В стандартной библиотеке C++ eof() имеет значение true, если чтение не удалось, однако в Arduino available() означает, что байт доступен для чтения. Их нельзя заменить напрямую.

,