ファイル処理を使ったパスワードシステム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ダンボ―ど

ファイル処理を使ったパスワードシステム

#1

投稿記事 by ダンボ―ど » 6年前

学校でプログラミングを習い始めたのがきっかけでたまに、わかる範囲で自作の簡単なプログラムを書いていたのですが講義の方ももポインタの方まで進んだので
復習がてら難しい(自分にとっては)コードを書いてみようと、パスワードの管理ができるプログラムを作成しようと思ったのですがいかんせんうまくいきません。
ファイル処理の部分に問題があるのは試行錯誤の結果わかったのですが原因がわかったところで解決策がわかりません。
以下にコードを載せます。長いですが一応全部貼ります。

コード:

/*
このプログラムはマスターキーを最初に設定し、以降は再度プログラムを実行した際にマスターキーを保存したファイルからキーを読み込み
入力されたキーと一致した場合のみ、もうひとつのパスワードファイルを呼び出しパスの、確認、追加、初期化を選択することができる。(予定)
*/
#include<stdio.h>
#include<stdlib.h>
void kakikomi();
int main(void)
{
	FILE *fp,*master;


	char mky[100], pass[10], passinfo[100], masterkey[100], ifmasterkey[100];
	int sth; 
	
	if (master = fopen("pass.txt", "r") == NULL) {
		master = fopen("pass.txt", "w");
		printf("マスターキー設定:");
		scanf("%s", mky);
		fprintf(master, "%s\n", mky);
               exit(1);
	}
	fgets(masterkey, 100, master);
	while(1)
  {
	
	printf("マスターキー入力:");
	scanf("%s", ifmasterkey);
		if (ifmasterkey != masterkey) {
		printf("マスターキーが一致しません\n");
		continue;
		 }
		 else
		 {
			break;//キーが一致した場合ループ脱出
		 }
   }


	do {
		printf("パスプログラムモード選択\n1:読み込み\n2:追加保存\n3:初期化\n");//モードの選択
		scanf("%d", &sth);
		switch (sth)
		{
		case 1:

			break;

		case 2:
			kakikomi();
			break;

		case 3:
			fp = fopen("pass.txt", "w");
			fclose(fp);
			break;

		}
	} while (sth >= 1 && sth <= 3);
	fclose(master);
	fclose(fp);
	return 0;
}
void kakikomi()
{
	char passinfo[100], pass[10];
	int a;
	FILE *fp2;
	fp2 = fopen("pass.txt", "a+");
	while (1) {
		printf("パスの名前入力\n");
		scanf("%100s", passinfo);
		fprintf(fp2, "%s\n", passinfo);
		printf("パス入力\n");
		scanf("%10s", pass);
		fprintf(fp2, "%s\n", pass);
		while (1) {
			printf("続行しますか?\n1:Yes  2:No\n");
			scanf("%d", &a);
			if (a == 1)break;
			else if (a == 2)exit(1);
			else continue;
		}
		continue;
	}
	fclose(fp2);
}
一部機能が未完成ではあるのですが途中段階で実行した結果は成功だったのですが最初の方にあるマスターキーの部分を追加したところで詰まっています。どうやらファイルから文字列(マスターキー)を読み込む動作のとこがいけないらしく、fgetsとfscanf両方試しましたが両者ともにべつべつのエラーをポップアップ付きで吐き出しました。
こちらのfgetsを使ったパターンだと(一部要約)
Line: 33
Expression: stream,valid()
というのがでました。
初心者なので見辛かったり、そもそもの欠点があったりするかもしれませんが、どうか解決策をヒントでもいいので教えていただけると嬉しいです.

だんぼーど

Re: ファイル処理を使ったパスワードシステム

#2

投稿記事 by だんぼーど » 6年前

fgetsをつかわず に
fscanf(master, "%s", ifmasterkey);
と書いた場合は
Expression: stream! = nullptr
というエラーをはきました。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ファイル処理を使ったパスワードシステム

#3

投稿記事 by みけCAT » 6年前

16行目
ダンボ―ど さんが書きました:

コード:

	if (master = fopen("pass.txt", "r") == NULL) {
=演算子より==演算子の方が先に計算されるので、
ファイルが開けた場合はfopenから有効なポインタが返るので、NULLでないものとNULLを比較した結果の0、すなわちポインタにするとNULLがmasterに入ります。
ファイルが開けなかった場合はfopenから返ったNULLと==の右辺のNULLを比較し、一致するので1、ポインタにするとおそらく不正な値がmasterに入ります。

コード:

	if ((master = fopen("pass.txt", "r")) == NULL) {
のようにカッコを追加するといいでしょう。

29行目
ダンボ―ど さんが書きました:

コード:

	if (ifmasterkey != masterkey) {
!=演算子は文字列の内容ではなくポインタを比較し、別の配列の先頭要素へのポインタを比較しているのでこの条件式は必ず1になるはずです。
文字列の比較にはstrcmp関数を使うといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

だんぼーど

Re: ファイル処理を使ったパスワードシステム

#4

投稿記事 by だんぼーど » 6年前

回答ありがとうございます。文字列同士を比べる際にstring関数を使うのをすっかり忘れていました。
ご指摘頂いた箇所の修正でエラーは無事、消えたのですが新な問題が発生しました。
ソースコードを修正した結果、

コード:


	if ((master = fopen("pass.txt", "r")) == NULL) {
		master = fopen("pass.txt", "w");
		printf("マスターキー設定:");
		scanf("%s", mky);
		fprintf(master, "%s", mky);
		fclose(master);
		exit(1);
	}
	fscanf(master, "%s", ifmasterkey);
	while(1)
  {
	
	printf("マスターキー入力:");
	scanf("%s", ifmasterkey);
		if (strcmp(ifmasterkey, masterkey) != 0) {
		printf("マスターキーが一致しません\n");
		continue;
		 }
		 else
		 {
			break;//キーが一致した場合ループ脱出
		 }
   }
となった(修正箇所だけ載せてます)のですが条件分岐がうまく動作しません。具体的にいうとマスターキーを正しく打ってもループ処理で再度マスターキー入力させられてしまいます。もちろんpassファイルはできていますし、マスターキーも保存されています。読み込みにも成功しています。
どこか見落としがあるのでしょうか?

だんぼーど

Re: ファイル処理を使ったパスワードシステム

#5

投稿記事 by だんぼーど » 6年前

わかりづらくて申し訳ございません。if文は マスターキーが合っているか会ってないかで条件分岐させるほうです(上記ソースコードのしたの方のif文です。)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ファイル処理を使ったパスワードシステム

#6

投稿記事 by みけCAT » 6年前

ファイルからマスターキーをifmasterkeyに読み込み、それを標準入力からのデータで上書きしてしまっていますね。
masterkeyが初期化されていなければ未定義動作です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

だんぼーど

Re: ファイル処理を使ったパスワードシステム

#7

投稿記事 by だんぼーど » 6年前

まさかそこのミスに気付かなかったなんて、、、。
無事、問題をクリアできました!なんだかすごい基礎的な部分のミスが多い気がしますね…。
みけCATさん、こんな時間に稚拙な質問に付き合っていただき本当にありがとうございました!
これで安らかに眠れます、、、

返信

“C言語何でも質問掲示板” へ戻る