プロが教える店舗&オフィスのセキュリティ対策術

文字列を保存する方法は、先だって、教わりました。ASCIIコードにキャストすれば良いという事でした。
今回は、文字列のみの保存ではなくて、文字列として使われていない文字コードを含む文字コードを保存したいのです。
暗号化のソフトウェアに使用するしたり、ハードデイスクを完全消去するソフトウェアに必要だと思っています。
勿論、暗号化には、CreateFile関数は、使う予定はありません。高水準ストリームを使う予定でおります。

Webサイトをググっても解決しないし、書籍を買っても解決できませんでした。
使用しているのは、VS2017Community MFCです。

以下のコードを書いてみました。
-------------------------------------------------------------------------------------------

void CFOpenSTestDlg::OnBnClickedButton14()
{
// CreateFileによる 00000001 保存
BOOL Ans;
CString PathN = _T("D:\\B75M_PLUS\\ドキュメント\\重要文書\\VS2017\\C++\\MFC\\テスト\\File書き込みTest\\FOpensTest\\FOpenSTest\\Debug\\Testファイル\\CFile0000Save1.txt");

int Bdata1;
Bdata1 = 0b00000001;
unsigned char Bdata;
Bdata = (unsigned char)Bdata1;

Ans = CreateFileBinaryWrite(PathN, Bdata);
CString MesERR(_T("ファイルに書き込み完了しました"));
if (Ans == 1) {
AfxMessageBox(MesERR, MB_OK | MB_ICONERROR);
}
else {
MesERR = (_T("ファイルに書き込み出来ませんでした"));
AfxMessageBox(MesERR, MB_OK | MB_ICONINFORMATION);
}
}
-------------------------------------------------------------------------------------------

BOOL CFOpenSTestDlg::CreateFileBinaryWrite(const CString &filen, const unsigned char &Bdata)
{
// CreateFileによる 00000001 保存
// 0~255までの数値として保存

HANDLE hFile = ::CreateFile(filen, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile) {
return FALSE;
}
DWORD WritedNum;
::WriteFile(hFile, Bdata, sizeof(Bdata), &WritedNum, NULL); //Win32 APIで書き込み
::CloseHandle(hFile); //閉じる
//結果を返す
return BOOL(Bdata.GetLength == WritedNum);
}
------------------------------------------------------------------------------------------
ビルドすると以下のエラーになります。

1>FOpenSTest.cpp
1>FOpenSTestDlg.cpp
1>d:\b75m_plus\ドキュメント\重要文書\vs2017\c++\mfc\テスト\file書き込みtest\fopenstest\fopenstest\fopenstest\fopenstestdlg.cpp(572): error C2664: 'BOOL WriteFile(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED)': 引数 2 を 'const unsigned char' から 'LPCVOID' へ変換できません。
1>d:\b75m_plus\ドキュメント\重要文書\vs2017\c++\mfc\テスト\file書き込みtest\fopenstest\fopenstest\fopenstest\fopenstestdlg.cpp(572): note: 整数型からポインター型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。
1>コードを生成中...
1>プロジェクト "FOpenSTest.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
*********************************************************************

char &Bdataにしたり、色々やりましたが、ダメでした。

他に、int型の変数に1を代入してみました。ところが、ビルドエラーになりませんでした。実行させてみたところ、ファイルを作成する事が出来ました。
しかし、出来上がったファイルには、何も書き込まれていませんでした。

どの様に書き換えれば、書き込みができるでしょうか?

質問1です。
char &Bdataにしたり、色々やりましたが、ダメでした。
どの様に書き換えれば、一文字の場合の書き込み処理ができるでしょうか?

質問2です。
もう一つ、上の処理コードの場合は、一文字だけですけど、複数の文字の場合の処理コードの教えていただけると幸いです。
つまり、
unsigned char Bdata[2];
の場合の保存処理の場合も教えて頂きたいのです。
そもそも、intの数値をunsigned charに無理やり代入する事がおかしいのは、分かっています。

質問1も、質問2も同様に、
unsigned charでは無くて、別の型を使用するのが正解ならば、正解の回答を教えて頂きたいと思っています。

よろしくお願いいたします。

質問者からの補足コメント

  • ごめんなさい。
    CreateFile関数を使う事自体が間違っているみたいでした。

    C/C++ 逆引き大全 560の極意
    秀和システム 出版
    増田 智明 著者

    と言う書籍によると、Creat関数は、互換性の為に残っている関数だと言う事が判明しました。
    何となくですが、推測できる状態でしかありませんが、CreatFile関数は、Creat関数よりも、もっと古い関数の様です。
    この書籍によるとOpen関数を使えと書かれていました。

    この書籍に書かれている様に、今後は、Open関数を使用して読み書きを行う処理に変更したいと思っております。なので、この質問は、今後、しません。
    Open関数で解らない事があったら、また、ご質問させて下さい。

    早速のご回答有難うございました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/04/28 12:20
  • キャストしないでアドレスを取得しろとは、どう言う処理なのでしょうか。
    キャストは、出来るだけするなが鉄則だと言う事は、知っておりますが、キャストせずに行える方法があると言う事を初めて聞きました。
    キャストせずに、アドレスを取得する方法を貴方が教えて下さりそうなので改めて、ここでご質問させていただきます。

    教えて下さい。どんなコードを書くのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2019/04/28 12:35
  • ご回答が無いみたいなので、これでこの質問は、締めます。
    締める理由は、

    C/C++ 逆引き大全 560の極意
    秀和システム 出版
    増田 智明 著者

    と言う書籍によると、Creat関数は、互換性の為に残っている関数だと言う事が判明しました。
    何となくですが、推測できる状態でしかありませんが、CreatFile関数は、Creat関数よりも、もっと古い関数の様です。
    この書籍にはOpen関数を使えと書かれていました。

    今後は、Open関数を使用して読み書きを行う処理に変更したいと思っております。なので、この質問は、今後、しません。
    Open関数で解らない事があったら、また、ご質問させて下さい。

    早速のご回答有難うございました。

      補足日時:2019/04/29 04:37
  • こちらの回答を下さった方に対する補足説明ではありません。
    自分の質問に関する補足説明です。

    【質問の理由についての補足説明】

    「今回は、文字列のみの保存ではなくて、文字列として使われていない文字コードを含む文字コードを保存したいのです。暗号化のソフトウェアに使用するしたり、ハードデイスクを完全消去するソフトウェアに必要だと思っています。」と、言う説明をしました。

    後で、誰かが見た時に参考になる様にちょっと、書き加えます。

    C++は、2進数が苦手です。C++の場合、2進数から10進数に変換するプログラムは、結構、簡単に書けます。しかし、10進数から2進数に変換処理するのに自分でプログラムを純2進を使用して算出する等の大変なプログラムを書かなければならなくなります。

    C♯は、2進数変換が楽にできます。なので、暗号化ソフトウェアを作成する場合は、C♯を使用する事をお勧めします。

      補足日時:2019/04/29 04:42

A 回答 (2件)

「キャスト」は (「自殺」願望のないプログラムでは) ダメじゃないかなぁ>#1.



アドレスをとってあげるべきだと思う.
この回答への補足あり
    • good
    • 0

>質問1です。


>char &Bdataにしたり、色々やりましたが、ダメでした。
>どの様に書き換えれば、一文字の場合の書き込み処理ができるでしょうか?

エラーメッセージで指摘されているように、キャストしてください。

>質問2です。
>もう一つ、上の処理コードの場合は、一文字だけですけど、複数の文字の場合の処理コードの教えていただけると幸いです。

配列なら、書き込みたい配列の先頭要素のアドレスと、書き込みたいサイズをバイト単位で指定するだけです。
いずれにしろCreateFile()の問題じゃないですけどね。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!