2016-09-01 5 views
2

先生が私たちに求めたことは次のとおりです。アクセス違反の場所を読み込むfprintf

ユーザーが入力した内容を保存するファイルを作成します。私の持つ問題はそれです。例外がスローされ、私にエラーはありません。最初の問題は、テキストファイル内の文字がデフォルトでCAPS(キャップ​​検証なし)にあることです。 2番目のエラーは、私がキーを押すとすぐに起こります(キャップ​​検証の場合)。

#include <direct.h> 
#include <fstream> 
#include <stdlib.h> 


using namespace std; 

//function that write to the file 
int Save(int _key, char *file, bool caps); 
int Backspace(); 
bool caps = false; 

int main() { 
    char i; 

    while (true) { 
     for (i = 8; i <= 255; i++) { 
      // Checks if a key is currently up or down 
      if (GetAsyncKeyState(i) == -32767) { 
       //Get caps lock state 
       if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0) { 
        //Caps lock is on 
        caps = true; 
        Save(i, "C:/users/myComputer/documents/school/c++/input.txt", caps); 
       } 
       else { 
        //Caps lock is off 
        caps = false; 
        Save(i, "C:/users/myComputer/documents/school/c++/input.txt", caps); 
       } 
      } 
     } 
    } 
    return 0; 
} 

int Save(int _key, char *file, bool caps) { 
    Sleep(10); 
    FILE *OUTPUT_FILE; 
    OUTPUT_FILE = fopen(file, "a+"); 

switch (_key) { 

    case VK_RETURN: 
     OUTPUT_FILE = fopen(file, "a+"); 
     fprintf(OUTPUT_FILE, "%s", "\n"); 
     break; 

    case VK_LBUTTON || VK_RBUTTON: 
     OUTPUT_FILE = fopen(file, "a+"); 
     fprintf(OUTPUT_FILE, "%s", ""); 
     break; 

    default: 
     if (caps == true) { 
      char i = tolower(putchar(_key)); 
      OUTPUT_FILE = fopen(file, "a+"); 
      fprintf(OUTPUT_FILE, "%s", i); 
     } 
     else { 
      char i = toupper(putchar(_key)); 
      OUTPUT_FILE = fopen(file, "a+"); 
      fprintf(OUTPUT_FILE, "%s", i); 
     } 
} 
fclose(OUTPUT_FILE); 

return 0; 
} 
+0

これはコマンドラインで実行していますか?プログラムはちょうど終了しますか? *エラーがありますか? if(GetAsyncKeyState(i)== -32767)がtrueに評価されない場合、プログラムはコンソールに何も印刷せずにすばやく終了します。 – dckuehn

+0

私はそれを試していませんでしたが、あなたは同じファイルを2回「開く」ことが許されていますか?あなたの 'Save'関数が開始時にファイルを開き、次に各ブランチでファイルを開くように見えます。 –

+0

@dckuehnええ、ビジュアルスタジオのデバッガ経由で。ビジュアルスタジオは私に休憩をするように頼みます。私がCapsLock機能を実装しようとする前に、それは素晴らしい仕事をしていました。 – Olivier

答えて

2

セグメンテーションフォールト

このコードにはいくつかの問題があります。しかし、セグメンテーションエラーの原因と主な問題は、それが引数として文字の配列へのポインタを見つけることfprintf()を告げる

 fprintf(OUTPUT_FILE, "%s", i); // Ouch !!! 

"%s"です。フォーマット文字列hereをクロスチェックします。残念ながら、8〜255の整数を指定すると、未定義の動作が発生します。

エラーがそれを変更する修正するには:switch内部

 fprintf(OUTPUT_FILE, "%c", i); 

その他の問題

fopen()呼び出しは冗長です:ファイルはすでに前にオープンしました。以前にファイルを閉じずにファイルを開くのは役に立ちません。

関数のドキュメントでは、最下位ビットと最上位ビットについて説明していますが、その中間のビットについては何も記載していません。したがって、チェックは次のようにする必要があります。

if (GetAsyncKeyState(i) & 0x8000) // but not strict equality 
+0

ありがとう、私は家に帰るとすぐに病気をテストする – Olivier

関連する問題