Каков правильный метод чтения и анализа файлов данных в C ++? - PullRequest
1 голос
/ 06 октября 2009

Что такое эффективный, правильный способ чтения в файле данных со смешанными символами? Например, у меня есть файл данных, который содержит смесь данных, загруженных из других файлов, 32-разрядных целых чисел, символов и строк. В настоящее время я использую объект fstream, но он останавливается после попадания в int32 или конец строки. если я добавляю случайные данные в конец строки в файле данных, кажется, что он завершается с остальной частью файла. Это приводит меня к мысли, что нулевое завершение, добавленное к строкам, портит его. Вот пример загрузки в файл:

void main()
{
    fstream fin("C://mark.dat", ios::in|ios::binary|ios::ate);
    char *mymemory = 0;
    int size;
    size = 0;
    if (fin.is_open())
    {
        size = static_cast<int>(fin.tellg());
        mymemory = new char[static_cast<int>(size+1)];
        memset(mymemory, 0, static_cast<int>(size + 1));

        fin.seekg(0, ios::beg);
        fin.read(mymemory, size);
        fin.close();
        printf(mymemory);
    std::string hithere;
    hithere = cin.get();
    }
}

Почему этот код может остановиться после чтения целого числа или строки? Как можно обойти это? Это неправильный подход при работе с файлами такого типа? Должен ли я использовать fstream вообще?

1 Ответ

3 голосов
/ 06 октября 2009

Задумывались ли вы, что чтение файла работает отлично, и это printf (mymemory), который останавливается на первом нуле?

Взгляните на отладчик и посмотрите, прав ли я.

Также, если вы хотите напечатать чей-то буфер, используйте put (mymemory) или printf ("% s", mymemory). Не принимайте чужой ввод для строки формата, это может привести к сбою вашей программы.

Попробуйте

for (int i = 0; i < size ; ++i)
{
  // 0 - pad with 0s
  // 2 - to two zeros max
  // X - a Hex value with capital A-F (0A, 1B, etc)
  printf("%02X ", (int)mymemory[i]);
  if (i % 32 == 0)
    printf("\n"); //New line every 32 bytes
}

как способ вывести файл данных обратно в шестнадцатеричном виде.

...