2012-05-18 86 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'。 –