文字列を保存する方法は、先だって、教わりました。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では無くて、別の型を使用するのが正解ならば、正解の回答を教えて頂きたいと思っています。
よろしくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
>質問1です。
>char &Bdataにしたり、色々やりましたが、ダメでした。
>どの様に書き換えれば、一文字の場合の書き込み処理ができるでしょうか?
エラーメッセージで指摘されているように、キャストしてください。
>質問2です。
>もう一つ、上の処理コードの場合は、一文字だけですけど、複数の文字の場合の処理コードの教えていただけると幸いです。
配列なら、書き込みたい配列の先頭要素のアドレスと、書き込みたいサイズをバイト単位で指定するだけです。
いずれにしろCreateFile()の問題じゃないですけどね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
干支のプログラム
-
TCP/IP通信型大文字・小文字変...
-
c++ 文字列を入力して、一文字...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
Visual Studio strcpyについて
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
int main()の・・・
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
DPマッチング
-
int型からchar型への変換
-
文字列から空白を取り除きたい...
-
バイナリファイルをコピーする...
-
c言語でユーザ関数を利用して入...
-
C言語のポインターで詰まっている
-
C++ の FileCopy の設定が解り...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報
ごめんなさい。
CreateFile関数を使う事自体が間違っているみたいでした。
C/C++ 逆引き大全 560の極意
秀和システム 出版
増田 智明 著者
と言う書籍によると、Creat関数は、互換性の為に残っている関数だと言う事が判明しました。
何となくですが、推測できる状態でしかありませんが、CreatFile関数は、Creat関数よりも、もっと古い関数の様です。
この書籍によるとOpen関数を使えと書かれていました。
この書籍に書かれている様に、今後は、Open関数を使用して読み書きを行う処理に変更したいと思っております。なので、この質問は、今後、しません。
Open関数で解らない事があったら、また、ご質問させて下さい。
早速のご回答有難うございました。
キャストしないでアドレスを取得しろとは、どう言う処理なのでしょうか。
キャストは、出来るだけするなが鉄則だと言う事は、知っておりますが、キャストせずに行える方法があると言う事を初めて聞きました。
キャストせずに、アドレスを取得する方法を貴方が教えて下さりそうなので改めて、ここでご質問させていただきます。
教えて下さい。どんなコードを書くのでしょうか?
ご回答が無いみたいなので、これでこの質問は、締めます。
締める理由は、
C/C++ 逆引き大全 560の極意
秀和システム 出版
増田 智明 著者
と言う書籍によると、Creat関数は、互換性の為に残っている関数だと言う事が判明しました。
何となくですが、推測できる状態でしかありませんが、CreatFile関数は、Creat関数よりも、もっと古い関数の様です。
この書籍にはOpen関数を使えと書かれていました。
今後は、Open関数を使用して読み書きを行う処理に変更したいと思っております。なので、この質問は、今後、しません。
Open関数で解らない事があったら、また、ご質問させて下さい。
早速のご回答有難うございました。
こちらの回答を下さった方に対する補足説明ではありません。
自分の質問に関する補足説明です。
【質問の理由についての補足説明】
「今回は、文字列のみの保存ではなくて、文字列として使われていない文字コードを含む文字コードを保存したいのです。暗号化のソフトウェアに使用するしたり、ハードデイスクを完全消去するソフトウェアに必要だと思っています。」と、言う説明をしました。
後で、誰かが見た時に参考になる様にちょっと、書き加えます。
C++は、2進数が苦手です。C++の場合、2進数から10進数に変換するプログラムは、結構、簡単に書けます。しかし、10進数から2進数に変換処理するのに自分でプログラムを純2進を使用して算出する等の大変なプログラムを書かなければならなくなります。
C♯は、2進数変換が楽にできます。なので、暗号化ソフトウェアを作成する場合は、C♯を使用する事をお勧めします。