[1.1] 作っているもの:チャットプログラム(ただしソケットを使わない)
[1.2] どのように取り組んだか(後述)
[1.3] ファイル内容を表示するときにごみデータが表示される
[2] 環境
[2.1] OS:Windows
[2.2] コンパイラ名:Borand C++
バグった時の画面
再現性は少ない
display_file関数にバグがあることは確かです。
4行目の1文字目に「・」が入り込んでいる
#define WIN32_LEAN_AND_MEAN // Windows ヘッダーから使用されていない部分を除外します。
#define LOG_FILE ".dll"
#define KEY 0
#include <windows.h>
#include <string> //ヘッダファイルインクルード
#include <iostream> //標準入出力(C++)
#include <fstream> //ファイル入出力
#include <stdlib.h> //標準ライブラリ…system()
#include <algorithm>
using namespace std; //名前空間指定
void add_file(const string);
void display_file();
void history_reset();
string ango(const string);
int main(){
string user="ゲスト"; //ローカル変数として、str を生成
string text="";
string ango;
cerr << "ユーザー名を入力:";
cin >> user;
add_file(user + "さんが入室しました。");
while("EXIT"!=text){
if(text!=""){
add_file(user+">>"+text);
}
display_file();
cerr << user << ">>";
history_reset();
getline(cin, text);
}
add_file(user + "さんが退室しました。");
}
void add_file(const string a){
if(a=="")return;
ofstream ofs(LOG_FILE,ios::binary|ios::app);
ofs << ango(a + "\r\n");
ofs.close();
}
void display_file(){
system("cls");
ifstream ifs(LOG_FILE,ios::binary);
if(!ifs){ return; } //ファイルが開けたか確認
char buf[256]; //256バイト分のバッファ
while(!ifs.eof()){
ifs.read(buf,256); //ストリームから256バイトバッファに読み込む
cout << ango(buf); //標準出力に出力してみる
}
ifs.close();
}
void history_reset(){
#define VK_MENU 0x12/*Alt*/
#define VK_F7 0x76/*F7*/
// キーの押し下げをシミュレートする。
keybd_event( VK_MENU, 0, 0, 0);
// キーの押し下げをシミュレートする。
keybd_event( VK_F7, 0, 0, 0);
system("timeout /t 1 /NOBREAK>nul");
// キーの解放をシミュレートする。
keybd_event( VK_F7, 0, KEYEVENTF_KEYUP, 0);
// キーの解放をシミュレートする。
keybd_event( VK_MENU, 0, KEYEVENTF_KEYUP, 0);
}
string ango(const string tmp){
string ret=tmp;
for(int i = 0; i < (int)ret.size(); ++i){
ret[i] = ret[i] ^ KEY;
}
return ret;
}
オフトピック
XOR暗号を使う理由はファイルを改ざんされにくくするためです。