fwrite関数について簡単な質問があります

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sadora3
記事: 175
登録日時: 7年前

fwrite関数について簡単な質問があります

#1

投稿記事 by sadora3 » 4年前

このプログラムで名前を入力した後に、fwrite関数でtxtファイルに出力すると、「名前ヘヘヘヘヘヘヘヘヘヘヘ」のように配列の空いてる部分まで出力されてしまいます。配列の\0で出力を止めたいのですが、どうすればいいのでしょう?

あと、もう一つ質問がありまして、
scanf("%s", test->Name);
の部分で、文字列を入力した際に、エンターを押した後、\0は代入されますよね。

あと\0の名前は文字列終端子であってますか?

コード:

#include<stdio.h>
#include<stdlib.h>

int main(){
	typedef struct{
		char Name[100];
		int Hp;
		int Mp;
	} TEST;
	TEST* test;
	test = (TEST*)malloc(sizeof(TEST));

	printf("キャラの名前を入力してください:");
	scanf("%s", test->Name);

	printf("キャラのHPを入力してください:");
	scanf("%d", &test->Hp);

	printf("キャラのMPを入力してください:");
	scanf("%d", &test->Mp);

	FILE *fp = fopen("セーブ.txt", "wb");
	fwrite(test, sizeof(TEST), 1, fp);

	free(test);

	rewind(stdin);
	getchar();
	return 0;
}


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

Re: fwrite関数について簡単な質問があります

#2

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

sadora3 さんが書きました:このプログラムで名前を入力した後に、fwrite関数でtxtファイルに出力すると、「名前ヘヘヘヘヘヘヘヘヘヘヘ」のように配列の空いてる部分まで出力されてしまいます。配列の\0で出力を止めたいのですが、どうすればいいのでしょう?
素直にfputs関数を用いるか、strlen(test->Name)+1バイトだけfwriteすればいいでしょう。
sadora3 さんが書きました:scanf("%s", test->Name);
の部分で、文字列を入力した際に、エンターを押した後、\0は代入されますよね。
はい。(実験してみればいいでしょう)
sadora3 さんが書きました:あと\0の名前は文字列終端子であってますか?
\0の名前はoctal escape sequenceです。(N1570 6.4.4.4 Character constantsを参照)
sadora3 さんが書きました:

コード:

	rewind(stdin);
	getchar();
このような環境依存かつ不要な処理はするべきではないでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sadora3
記事: 175
登録日時: 7年前

Re: fwrite関数について簡単な質問があります

#3

投稿記事 by sadora3 » 4年前

fputs関数を使えばいいのですね。
rewind(stdin);はやらない方がよかったですか。
参考になりました。どうもありがとうございました。

zeek

Re: fwrite関数について簡単な質問があります

#4

投稿記事 by zeek » 4年前

みけCAT さんが書きました:
sadora3 さんが書きました:

コード:

	rewind(stdin);
	getchar();
このような環境依存かつ不要な処理はするべきではないでしょう。
このコードのどの部分が「環境依存」なのでしょうか?

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: fwrite関数について簡単な質問があります

#5

投稿記事 by YuO » 4年前

zeek さんが書きました:
みけCAT さんが書きました:
sadora3 さんが書きました:

コード:

	rewind(stdin);
	getchar();
このような環境依存かつ不要な処理はするべきではないでしょう。
このコードのどの部分が「環境依存」なのでしょうか?

コード:

rewind(stdin);
が問題です。stdinがSeek可能かどうかや,stdinがSeek可能な場合でもSeekした場合にどう振る舞うべきかが標準規格では定義されていないため,このコードがどのような動きをするのかはわかりません。

zeek

Re: fwrite関数について簡単な質問があります

#6

投稿記事 by zeek » 4年前

なるほど
fseek(stdin, 0L, SEEK_SET);
も環境依存ということですね。
ありがとうございました。

閉鎖

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