2017-11-17 7 views
1

複数行のビンファイルを作成するコードを作成する際に問題があります。それぞれの行に6つの値が含まれています。 私は、各行が「パスワード」になる小さなプロジェクトをやっているので、私のシステムはこのファイルを読み込み、更新された時などにすべてのパスワードを読み込みます。 私は読まない方法を実装しませんでした。私はファイルを操作するために苦労しているので、まだファイル。 このプロジェクトはlinuxでGPIO機能を持つRaspberry pi から実行されるので、Visual Studioを使用してメインコードを作成しています。バイナリファイルに関する助けが必要

私の現在のコードは次のとおりです。事前に

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char keys[4] = { '1', '2', '3', '4' }; // NOT USING 
char temp_key[6]; 

int incl_key() { 
    int i; 
    FILE *fp; 
    char code = "0"; 
    int control = 0; 
    int var_internal = 0; 

    fp = fopen("keys.bin", "wb"); 
    if (fp == NULL) { 
     printf("\n Error opening file. \n"); 
    } 

    printf("write your sequence <6 digits>:\n"); 

    do{ 
     scanf("%s", &temp_key); 
     fputs(temp_key, fp); 
     fputs("\n", fp); 
     control++; 
    } while (control < 5); 
    fclose(fp); 
} 

int keys_db() { 
    return 0; 
} 

int main() { 
    incl_key(); 

    system("PAUSE"); 
} 

感謝。

+3

あなたの質問が何であるか、またはあなたの特定の問題が何であるかは明確ではありません。それを「行」として整理したいのであれば、それはなぜバイナリファイルですか? – lurker

+0

コードは 'char temp_key [6];で配列境界の外に書き出しています。 scanf( "%s"、&temp_key);そして '' 123456 "'のように入力します。 – chux

+2

あなたの 'temp_key'には6つの要素があり、あなたは6文字のサンプルデータを見せてくれました。これは、 'fputs'を呼び出すときに' temp_key'がいっぱいであり、終端ヌル文字を含んでいないことを意味します。だから 'fputs'は配列をオーバランしてnullを探し、ファイルに何が書かれているのかわからない。 'temp_key'を終端ヌルのための十分なスペースで定義し、' scanf'があまり読み込まないようにしてください。 –

答えて

0

配列が文字列のようにユーザー入力には小さすぎます。

char temp_key[6]; 
printf("write your sequence <6 digits>:\n"); 
scanf("%s", &temp_key); // poor code 

文字列は、と最初のNULL文字を含むで終わる文字の連続配列です。置く

1種類、、、、、は、を入力し、'1''2''3''4''5''6''\n'stdinscanf("%s", temp_key);は、先頭の空白を探し、何も見ず、次に6つの非空白の計算機を読み込み、temp_key[0]temp_key[1]、.... temp_key[5]に保存します。 '\n '(空白)を読み出し、"%s"は多くのための走査を停止するように指示し、それストリング作るtemp_key[6]にヌル文字を追加しようとするその後の入力とためバックstdin'\n'を置きます。しかし、temp_key[]は小さすぎて何かが起こることがあります - 未定義の動作です。残りのコードは無関係です。

scanf("%s", &temp_key);は、3つの理由から不適切なコードです。

  1. &temp_key配列の最初のエレメントのアドレスは"%s"と一致するために必要とされるアレイのアドレスを渡します。これらのアドレスはどちらも同等の値を持ちますが、タイプは異なります。これ自体はの未定義の動作です。まだ時間の大半は、それが正しいscanf("%s", temp_key);(NO &)のような「動作」

  2. scanf("%s", temp_key);は、バッファオーバーランに6桁以上の結果を入力し、上記で概説したように読み出され、どのくらいのデータに制限を提供しませんおよび未定義の動作

  3. 戻り値はチェックされていないため、コードは正常に処理されたかどうかを認識しません。 stdinで終了しました(入力なし)またはその他の懸念事項がありました。

代わりストリングユーザ入力のラインと秘密入力ことを読み取ることfgets()を使用します。

#define KEY_N 6 
//   key \n \0 extra - why be stingy? 
char temp_key[KEY_N + 1 + 1 + 10]; 

//scanf("%s", &temp_key); 
if (fgets(temp_key, sizeof temp_key, stdin)) { 
    // user input successfully read! 

    temp_key[strcspn(temp_key), "\n"] = '\0'; // lop off potential trailing \n 
    if (strlen(temp_key) != KEY_N) Handle_Invalid_Input(); 
    else GoodToGo(); 
} 

コードは、あまりにも他の問題を有することができます。

例:バイナリ対テキストモードの「」は、「Linuxで動作しています...私はVisual Studioを使用しています」というテキストファイルのように表示される「keys.bin」の読み込みに対する懸念があります。今のところOPがバイナリファイルとして扱われている限り、それはOKと思われます。

関連する問題