Я хочу прочитать файл через 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?
Для 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') в конце массива.
xdoc.parse<0>(buffer);
Поэтому добавьте следующий lin после чтения файла, а также выделите место для этого '\ 0.
buffer[lSize]='\0
Вы пропустили две вещи:
на malloc:
buffer = (char *) malloc (sizeof (char) * lSize + 1); //место для '\ 0';
после прочтения:
буфер [lsize] = '\ 0'; // завершение строки
Вы также можете использовать метод fgets()
или std::ifsteam
getline
std::ifsteam
- это класс. getline
- метод чтения с пробелами, вы можете установить разделитель на 0, чтобы прочитать все из текстового файла. больше c ++, чем fread / fgets, которые являются c-методами. также вы можете использовать new
вместо malloc
, delete
вместо free
(кстати: вы пропустили free) и так далее. если вы хотите пойти дальше, вы также можете читать напрямую в std :: string.