2012-05-18 126 views
1

我想解析一個文本文件與c + +中的win32程序。是否有一種逐行讀取文本文件的簡單方法?我的文本文件由我想存儲在char數組中的字符串組成(const char * cArray [67])。這是我到目前爲止。我正在使用CreateFile和ReadFile。我從ReadFile的獲取訪問衝突錯誤(0x000003e6):閱讀一個文本文件w/WIN32

CDECK::CDECK():filename(".\\Deck/list.txt") 
{ 
    LPVOID data = NULL; 
    hFile = CreateFileA(filename, GENERIC_READ,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
    if(hFile == INVALID_HANDLE_VALUE) 
     MessageBox(NULL, L"Failed to CreateFile - 'hFile'", L"CDECK::CDECK()", MB_OK); 

    DWORD fileSize = GetFileSize(hFile, &fileSize); 
    DWORD read = -1; 
    if(!ReadFile(hFile, data, fileSize, &read, NULL)) 
    { 
     DWORD err = GetLastError(); 
     MessageBox(NULL, L"Failed to ReadFile - 'hFile'", L"CDECK::CDECK()", MB_OK); 
    } 
    return; 
} 
+0

太糟糕了,你不能使用像Python這樣的東西..... –

+0

你*有*直接使用winapi調用嗎?你可以使用'std :: ifstream'來讀取數據,並將結果存儲在'std :: vector '中? –

+2

令人難以置信的是Win32 API在儘可能簡單地完成簡單任務時的扭曲。嘗試使用普通的舊C++;簡單。 Python,Ruby,Perl ...簡單,容易,簡單。如果你知道你在做什麼,即使是好的老C也不錯。但是,在Windows API層中,你突然被射穿蟲洞到博格的腹部。 – DavidO

回答

9

是否有讀一行文本文件一行一個簡單的方法?

是:

{ 
    std::ifstream hFile(filename); 

    std::vector<std::string> lines; 
    std::string line; 
    while(std::getline(hFile, line)) 
    lines.push_back(line); 

    return lines; 
} 
+0

不是逐字而不是逐行地獲取文本嗎? –

+3

d'呃。當然。固定。令人驚訝的是,三個人高聲讚揚我的錯誤答案,但。 –

+1

+1,你現在可以刪除「未經測試」的評論。 –

5

考慮以下代碼:

LPVOID data = NULL; 
if(!ReadFile(hFile, data, fileSize, &read, NULL)) 

這裏data是空的,下面的參數是整個文件的大小。您應該分配一個緩衝區,然後將指針傳遞給此緩衝區,並將其大小傳遞給它。 ReadFile函數將寫入相關字節。

這裏是得到它的一個靜態大小的緩衝區工作的一個簡單的方法:

char data[4096] = {}; 
if(!ReadFile(hFile, static_cast<LPVOID>(&data), 4096, &read, NULL)) 
1

你的問題是,你正在閱讀的文件的字節數,讀取需要使用SysAllocStringByteLen到的Alloc字符串的位置,然後使用ReadFile的

字符串
+3

你在哪裏得到了使用'SysAllocStringByteLen'的要求? –

+0

https://msdn.microsoft.com/pt-br/library/windows/desktop/ms221637(v=vs.85).aspx 或者你也可以只使用VirtualAlloc,這個想法是在閱讀之前分配一個虛擬空間它。 –

+0

Windows BSTRings(由'SysAllocstringByteLen'生成)專用於COM/OLE代碼,否則它們沒有任何優勢。 ReadFile對任何緩衝區都很滿意。最簡單的是'std :: string'。 –