Как правильно читать файл через stdio? C ++

0

Я хочу прочитать файл через stdio для RapidXML. Я использовал следующее:

#include <iostream>
#include <rapidxml.hpp>
#include <stdio.h>
#include <Windows.h>

using namespace rapidxml;

int main(int argc, char** argv)
{
    FILE *pFile;
    pFile = fopen("D:\\ColladaFiles\\sample1.dae", "rb");
    long lSize;
    char *buffer;
    size_t result;

    //if error
    if (pFile == NULL) { fputs("File error", stderr); exit(1); }

    // obtain file size:
    fseek(pFile, 0, SEEK_END);
    lSize = ftell(pFile);
    rewind(pFile);

    // allocate memory to contain the whole file:
    buffer = (char*)malloc(sizeof(char)*lSize);
    if (buffer == NULL) { fputs("Memory error", stderr); exit(2); }

    // copy the file into the buffer:
    result = fread(buffer, 1, lSize, pFile);
    if (result != lSize) { fputs("Reading error", stderr); exit(3); }

    /* the whole file is now loaded in the memory buffer. */

    xml_document<> xdoc;
    xdoc.parse<0>(buffer);

    system("pause");
    return 0;
}

У RapidXML возникла ошибка. Потому что, если я пишу буфер следующим образом:

std::cout << buffer << std::endl;

Последняя строка содержит следующее: Изображение 174551 Как быстро прочитать файл для RapidXML?

  • 1
    Это какой-то фииииине С ++.
  • 1
    @ScarletAmaranth ScarletAmaranth Вы не получили записку? Сарказм не работает в интернете. Особенно не в комментариях без контекста. Итак, говоря об этом: это C, скомпилированный с помощью компилятора C ++.
Теги:
stdio
rapidxml
cstdio

3 ответа

1

Для C++ вы не должны читать файл таким образом. См. Этот вопрос. Читать весь ASCII файл в C++ std :: string

В принципе, попробуйте это вместо этого.

std::ifstream t("D:\\ColladaFiles\\sample1.dae"); 
std::stringstream buffer; 

buffer << t.rdbuf(); //read file into stringstream

xdoc.parse<0>(buffer.str().c_str()); // parse it
0

Следующая строка ожидает массив символов с нулевым символом завершения ('\ 0') в конце массива.

xdoc.parse<0>(buffer);

Поэтому добавьте следующий lin после чтения файла, а также выделите место для этого '\ 0.

buffer[lSize]='\0
0

Вы пропустили две вещи:

  1. на malloc:

    buffer = (char *) malloc (sizeof (char) * lSize + 1); //место для '\ 0';

  2. после прочтения:

    буфер [lsize] = '\ 0'; // завершение строки

Вы также можете использовать метод fgets() или std::ifsteam getline

  • 0
    Является ли std :: ifsteam быстрым методом? Я имею в виду, что потоковые методы медленнее, чем c-методы для чтения.
  • 0
    std::ifsteam - это класс. getline - метод чтения с пробелами, вы можете установить разделитель на 0, чтобы прочитать все из текстового файла. больше c ++, чем fread / fgets, которые являются c-методами. также вы можете использовать new вместо malloc , delete вместо free (кстати: вы пропустили free) и так далее. если вы хотите пойти дальше, вы также можете читать напрямую в std :: string.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню