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

Я хочу прочитать файл через 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;

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

3 ответа

Для 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

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

  1. на malloc:

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

  2. после фреда:

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

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

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

xdoc.parse<0>(buffer);

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

buffer[lSize]='\0
Другие вопросы по тегам