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;

最后一行包含以下内容: 在此处输入图像描述 如何快速读取 RapidXML 文件?

4

3 回答 3

0

以下行需要在数组末尾带有空终止字符 ('\0') 的 char 数组。

xdoc.parse<0>(buffer);

因此,在读取文件后添加以下 lin,并为该 '\0' 分配空间。

buffer[lSize]='\0
于 2014-01-08T05:26:59.113 回答
0

You missed two things:

  1. on malloc:

    buffer = (char*)malloc(sizeof(char)*lSize + 1); //place for '\0';

  2. after fread:

    buffer[lsize]='\0'; //terminate string

You can also use fgets() or std::ifsteam method getline

于 2013-12-22T14:27:48.817 回答
0

对于 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
于 2014-01-10T10:29:40.573 回答