3

C++のwin32プログラムでテキストファイルを解析しようとしています。テキストファイルを1行ずつ読み取る簡単な方法はありますか?私のテキストファイルは、char配列(const char * cArray [67])に格納したい文字列で構成されています。これが私がこれまでに持っているものです。CreateFileとReadFileを使用しています。readfileからアクセス違反エラー(0x000003e6)が発生します:

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;
}
4

4 に答える 4

10

テキストファイルを1行ずつ読み取る簡単な方法はありますか?

はい:

{
  std::ifstream hFile(filename);

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

  return lines;
}
于 2012-05-18T19:31:05.477 に答える
6

このコードを考えてみましょう:

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

これはnullであり、次dataの引数はファイル全体のサイズです。バッファを割り当ててから、そのようなバッファへのポインタとそのサイズを渡すことになっています。ReadFile関数が読み取ったバイトを書き込む場所があります。

静的なサイズのバッファで動作させる簡単な方法は次のとおりです。

char data[4096] = {};
if(!ReadFile(hFile, static_cast< LPVOID >( &data ), 4096, &read, NULL))
于 2012-05-18T19:14:41.503 に答える
0

問題は、ファイルのバイトを読み取っているということです。文字列を読み取るには、SysAllocStringByteLenを使用して文字列の場所を割り当ててから、ReadFileを使用する必要があります。

于 2012-05-20T03:57:43.533 に答える
0

データを読み取る前にバッファスペースを割り当てるのを忘れました:LPVOID data = NULL;

読み取る前に、fileSizeバッファスペースを割り当てる必要があります。data= malloc(fileSize);

また、おそらくデータ変数をvoid*ではなくchar*として宣言する必要があります

于 2018-11-18T10:29:48.843 に答える