2013-12-22 60 views
0

我想通過stdio讀取RapidXML文件。我使用以下內容:如何通過stdio讀取正確的文件? C++

#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; 

最後一行是包含以下內容: enter image description here 如何快速讀取RapidXML文件?

+1

這是一些fiiii的C++。 – ScarletAmaranth

+1

@ScarletAmaranth你沒有得到備忘錄?諷刺在互聯網上不工作。特別是在沒有上下文的評論中。所以:拼寫出來:這是C,用C++編譯器編譯。 – sehe

回答

0

你錯過兩兩件事:

  1. 上的malloc:

    緩衝液=(字符*)malloc的(的sizeof(char)的* lSize所+ 1); //放置'\ 0';

  2. 的fread後

    緩衝液[LSIZE] = '\ 0'; //終止字符串

也可以使用fgets()std::ifsteam方法getline

+0

是std :: ifsteam一個快速方法嗎?我的意思是,流式傳輸方法比讀取方式慢。 – Ivan

+0

'std :: ifsteam'是一個類。 'getline'是用空格讀取的方法,您可以將分隔符設置爲0以從文本文件中讀取全部。它是更多的c + +然後fread/fgets這是c方法。你也可以使用'new'而不是'malloc','delete'而不是'free'(順便說一句:你錯過了免費),等等。如果你想更進一步,你也可以直接讀取std :: string。 – SHR

+0

看看這裏的第一個答案爲最好的方式來做到這一點:http://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring – SHR

0

下面的行期待與在陣列的末尾的空終止字符(「\ 0' )char數組。

xdoc.parse<0>(buffer); 

因此,在讀取文件後添加以下lin,並且爲'\ 0'分配空間。

buffer[lSize]='\0 
1

對於C++,您不應該以這種方式讀取文件。看到這個問題。 Read whole ASCII file into 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