どのようなプログラム要求仕様があったかは分かりませんが、本来、Win32APIであるWriteFile
を使うまでもないです。WriteFile
を使いたいのであれば、ファイルオープンにはCreateFile
を使わなければならないし、Windows特有のAPIなので、比較的初心者の方にはあまりお勧めできないものでもあります。それでも質問に回答するならば、以下のようなコードになるかと思います。
C++
1#include <Windows.h>
2#include <locale.h>
3#include <atlstr.h> // CString
4#include <stdio.h>
5
6int main()
7{
8 setlocale(LC_ALL, "Japanese");
9
10 CString strDevName = _T("DeviceName");
11
12 // _t...関数群を使うなら、_Tマクロを使うべきでは。
13 // _tprintf(L"%ls%ls%ls", L"サーバ名'", strDevName, L"'を設定しました。\n");
14 _tprintf(_T("%ls%ls%ls"), _T("サーバ名'"), (LPCTSTR)strDevName, _T("'を設定しました。\n"));
15
16 // 書きたいデータはいったんバッファーに格納しとく
17 TCHAR message[256];
18 _stprintf_s(message, _countof(message), _T("%ls%ls%ls"), _T("サーバ名'"), (LPCTSTR)strDevName, _T("'を設定しました。\n"));
19 _tprintf(_T("%s"), message);
20
21 // WriteFileを使う版
22 const TCHAR fileName[] = _T("./output.txt");
23 HANDLE handle = CreateFile(fileName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
24 if (handle != INVALID_HANDLE_VALUE) {
25 DWORD numOfBytesWritten = 0;
26 BOOL succeeded = WriteFile(
27 handle, // ファイルハンドル
28 message, // 書き込みたいデータのアドレス
29 _tcslen(message) * sizeof(message[0]), // 書き込みたいデータの"バイト"数
30 &numOfBytesWritten, // 書き込みが成功した場合に実際に書き込んだバイト数を格納する変数へのポインタ
31 NULL); // WriteFile API を非同期で使う場合のみセットする。使わないのでNULLで可
32 if (succeeded) {
33 _tprintf(_T("%lu バイト書き込みました。\n"), numOfBytesWritten);
34 }
35 else {
36 DWORD lastError = GetLastError();
37 _tprintf(_T("ファイル書き込みに失敗しました。GetLastError()=%lu, 0x%X\n"), lastError, lastError);
38
39 }
40 CloseHandle(handle);
41 }
42
43 // Win32 APIを使うまでもないかと。標準入出力のライブラリで充分かつ使いやすい
44 FILE* fp;
45 errno_t err = _tfopen_s(&fp, fileName, _T("ab"));
46 if (err == 0) {
47
48 _tprintf(_T("%s"), message);
49
50 // _tprintfと同じ,標準出力へ出力
51 _ftprintf(stdout, _T("%s"), message);
52
53 // ファイル(fp)へ出力
54 _ftprintf(fp, _T("%s"), message);
55 fclose(fp);
56 }
57
58 return 0;
59}
ご質問のコードではCString
が出てきたり、_tprintf
に対してWriteFile
であったり、間違いではありませんが、若干混乱が見受けられます。WriteFile
ではなく、fopen
、fwrite
, fprintf
等の標準関数でもファイルは十分扱えるので、まずはそれらでやってみるのも良いかと思います。上記サンプルコードでは_tfopen
, _ftprintf
で同じようなコードを追記しています。
尚、出力されるファイルのエンコードには注意してください。UNICODEビルドですとUTF16LEになります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/09/30 00:03
2019/09/30 00:09
2019/09/30 00:09
2019/09/30 00:12
退会済みユーザー
2019/09/30 00:23
退会済みユーザー
2019/09/30 00:23
2019/09/30 00:33
退会済みユーザー
2019/09/30 01:41
2019/09/30 01:44
2019/09/30 02:01