文字の扱いについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
文字の扱いについて

文字の扱いについて

#1

投稿記事 by 文字の扱いについて » 16年前

以下のソースで書き込めないのですが
おかしいのでしょうか?
char Text[/url] = "あいうえお";

	FILE	*fp;			// ファイルポインタを宣言

	// ファイルを開く
	if((fp = fopen("Test.txt", "w")) == NULL){		// wは書き込み rで読み込み
		printf("FILE OPEN ERROR\n");				// エラー処理
	}

	fprintf(fp, "%c",*Text);						// ファイルへ文字列を書き込む

	// ファイルを閉じる
	if(fclose(fp) == EOF){		
		printf("FILE CLOSE ERROR\n");				// エラー処理
	}

kazuoni

Re:文字の扱いについて

#2

投稿記事 by kazuoni » 16年前

まずこれだとコンパイルすら通らないですよね?
まずはそれからだと思うのですが・・・

もし、上のコードがコンパイルが通るコードからの抜粋だとしたらの話ですが、
fprintf(fp, "%s",Text);
で試してみてください。

lbfuvab

Re:文字の扱いについて

#3

投稿記事 by lbfuvab » 16年前

それでは'あ'の一バイト目をかきこんでいるだけです。
fprintfやfputsでググると良いでしょう。

SooA

Re:文字の扱いについて

#4

投稿記事 by SooA » 16年前

詳しくは printf関数に関して調べてみてください。

fprintf( fp, "%s", Text ) ;

または

fprintf( fp, Text ) ;

Re:文字の扱いについて

#5

投稿記事 by » 16年前

char Text[/url] = "あいうえお";

void main(void)
{
	//  ファイルを開く → ファイルの読み書きをする → ファイルを閉じる
	WriteFile(*Text);

}

void	WriteFile(char str)
{

	// printf("Data = %d\n",(int)Num);

	FILE	*fp;			// ファイルポインタを宣言

	// ファイルを開く
	if((fp = fopen("Test.txt", "w")) == NULL){		// wは書き込み rで読み込み
		printf("FILE OPEN ERROR\n");				// エラー処理
	}

	fprintf(fp, "%s",str);						// ファイルへ文字列を書き込む

	// ファイルを閉じる
	if(fclose(fp) == EOF){		
		printf("FILE CLOSE ERROR\n");				// エラー処理
	}
}
で試したのですが強制終了してしまいます・・・。

kazuoni

Re:文字の扱いについて

#6

投稿記事 by kazuoni » 16年前

>あさん
トピ主さんですか?
もしそうだとしたら名前は統一してください。
誰が質問者か分からなくなってしまいます。

まずは
・プロトタイプ宣言
・文字列処理(ポインタ)

を復習されてはいかがでしょうか?
また、lbfuvabさんの助言をよく考えてみてください。

バグ

Re:文字の扱いについて

#7

投稿記事 by バグ » 16年前

ファイルオープンに失敗した場合も処理を続行していますが、それは意図的に行なっているのでしょうか?

スレ主です

Re:文字の扱いについて

#8

投稿記事 by スレ主です » 16年前

皆様、返信ありがとうございます。

いろいろなサイトで勉強し下記のようにソースを変えました。
書き込みではなんとかできるのですが
読み込みでエラーが起こります。
どこが間違えているのか指摘していただけないでしょうか?
#pragma warning(disable: 4996)		// C4996のワーニングを無効

#include	<stdio.h>

void WriteFile(char *str);		// スコアを書き出す
void ReadFile(char *str);

char *Text = "あいうえお";

void main(void)
{
	//  ファイルを開く → ファイルの読み書きをする → ファイルを閉じる
	WriteFile(Text);
	ReadFile(Text);

}

void	WriteFile(char *str)
{
	FILE	*fp;			// ファイルポインタを宣言

	// ファイルを開く
	if((fp = fopen("Test.txt", "w")) == NULL){		// wは書き込み rで読み込み
		printf("FILE OPEN ERROR\n");				// エラー処理
	}

	fprintf(fp, "%s",str);						// ファイルへ文字列を書き込む

	// ファイルを閉じる
	if(fclose(fp) == EOF){		
		printf("FILE CLOSE ERROR\n");				// エラー処理
	}
}

void	ReadFile(char *str)
{
	
	FILE	*fp;			// ファイルポインタを宣言
	// ファイルオープン
	if((fp = fopen("Test.txt","r")) == NULL){
		printf("FILE OPEN ERROR\n");				// エラー処理
	}

	// ファイルから得点を読み込む
	fscanf(fp, "%s", str);
	printf("Data = %s\n",str);

	// ファイルクローズ
	if(fclose(fp) == EOF){
		printf("FILE OPEN ERROR\n");				// エラー処理
	}
}

スレ主です

Re:文字の扱いについて

#9

投稿記事 by スレ主です » 16年前

>>バグさん
ごめんなさい・・・
意図的に行っているつもりはないのですが
どうすればよいのかわかりません・・・・。

array

Re:文字の扱いについて

#10

投稿記事 by array » 16年前

> 読み込みでエラーが起こります。
読み込みは、fscanf()ではなく、fgets()を使えばいいと思います。

スレ主です

Re:文字の扱いについて

#11

投稿記事 by スレ主です » 16年前

>>arrayさん
fgetsを使ってみたのですが
要素?の調べ方がわからずエラーが出てしまいます。

fgets(文字配列,配列の要素数,ファイルポインタ);

らしいのですが
配列ではないので理解できませんでした・・・。

バグ

Re:文字の扱いについて

#12

投稿記事 by バグ » 16年前

fscanf自体は問題ないのでは?
それよりも問題なのは、書き換え不可能なTextというポインタ変数が指している領域を書き換えようとしている点ではないでしょうか?

char buf[1024];
ReadFile(buf);

とでも書き換えればいいかと。

kazuoni

Re:文字の扱いについて

#13

投稿記事 by kazuoni » 16年前

名前は
文字の扱いについて
さんで固定したほうがいいですよ。投稿者がその名前なので。

とりあえず原因は
書き込めないところに書き込もうとしているのが理由です。

ReadFile()では
char *Text = "あいうえお";
の先頭のアドレスを引数として渡しています。
そのアドレスで引数strは初期化されています。
fscanf(fp, "%s", str);
では、strに読み込んだ文字を代入しようとしています。、
もともとstrはグローバル変数Textで初期化されたのですが、
Textはchar型の配列ではなく、char型のポインタのです。

なので、代入はできません。

解決策としては、ReadFile()中で、新たにchar型の配列を用意し、
あらかじめすべてnullで初期化します。
あとはそこにfscanfで代入してやれば一応は解決します。

訂正
4/19 21:25
誤った回答だったので、打ち消し線を引かせていただきました。

kazuoni

Re:文字の扱いについて

#14

投稿記事 by kazuoni » 16年前

そして、バグさんともろかぶりました・・・w

バグさんと言いたいことは全く同じでした^^;

Mist

Re:文字の扱いについて

#15

投稿記事 by Mist » 16年前

> では、strに読み込んだ文字を代入しようとしています。、
> もともとstrはグローバル変数Textで初期化されたのですが、
> Textはchar型の配列ではなく、char型のポインタのです。
> なので、代入はできません。

この部分の説明は的外れだよ。
Textの指し示す先が文字リテラルであるからダメなのであって、charのポインタだから代入できないってのは意味不明です。

kazuoni

Re:文字の扱いについて

#16

投稿記事 by kazuoni » 16年前

>トピ主さん
自分の理解が浅い時に回答してしまい大変申し訳ありませんでした。
Mistさんの回答を参考にしてください。


>Mistさん
自分でも書いていてちょっと変だなっと思ってました。。
回答を控えるべきでした。

文字列リテラルがコンパイル後に(環境依存ですが)ROM領域に生成
されるっというのは知りませんでした。。
ご忠告本当にありがとうございました。

バグ

Re:文字の扱いについて

#17

投稿記事 by バグ » 16年前

トピ主さんのソースを元に、私の好みの書き方で書きなおしてみました。
黒文字で書いていますので、どうしても分からない場合にだけ、反転させて御覧ください。m(__)m

#include <stdio.h>

// プロトタイプ宣言
int Write(const char* filePath, const char* writeString);
int Read(const char* filePath, char* readBuffer)

void main(void)
{
	char *str = "あいうえお";
	char buf[256] = {0};

	// 書き込み
	switch (Write("Test.txt", str))
	{
	case 1:
		printf("FILE_OPEN_ERROR\n");
		return;
	case 2:
		printf("FILE_CLOSE_ERROR\n");
		return;
	default:
		printf("FILE_WRITE_SUCCESS\n");
		printf("WRITE_DATA = %s\n", str);
		break;
	}

	// 読み込み
	switch (Read("Test.txt", buf))
	{
	case 1:
		printf("FILE_OPEN_ERROR\n");
		return;
	case 2:
		printf("FILE_CLOSE_ERROR\n");
		return;
	default:
		printf("FILE_READ_SUCCESS\n");
		printf("READ_DATA = %s\n", buf);
		break;
	}
}

// ファイルへ文字列を書き込む
//
// 引数
// const char* filePath = ファイルパス
// const char* writeString = ファイルへ書き込む文字列
//
// 戻り値
// 0 = 正常終了
// 1 = ファイルオープン時にエラー
// 2 = ファイルクローズ時にエラー
int Write(const char* filePath, const char* writeString)
{
	// ファイルを書き込みモードでオープン
	FILE *fp = fopen(filePath, "w");

	// エラー判定
	if (fp == NULL)
	{
		// ファイルオープン時にエラーが発生したので、1を返す
		return 1;
	}

	// ファイルへ文字列を書き込む
	fprintf(fp, "%s", writeString);

	// ファイルクローズ
	if (fclose(fp) == EOF)
	{
		// ファイルクローズ時にエラーが発生したので、2を返す
		return 2;
	}

	// 正常に終了したので0を返す
	return 0;
}

// ファイルへ文字列を書き込む
//
// 引数
// const char* filePath = ファイルパス
// char* readBuffer = 読み込んだ文字列を格納するバッファ
//
// 戻り値
// 0 = 正常終了
// 1 = ファイルオープン時にエラー
// 2 = ファイルクローズ時にエラー
int Read(const char* filePath, char* readBuffer)
{
	// ファイルを読み込みモードでオープン
	FILE *fp = fopen(filePath, "r");

	// エラー判定
	if (fp == NULL)
	{
		// ファイルオープン時にエラーが発生したので、1を返す
		return 1;
	}

	// ファイルから文字列を読み込む
	fscanf(fp, "%s", readBuffer);

	// ファイルクローズ
	if (fclose(fp) == EOF)
	{
		// ファイルクローズ時にエラーが発生したので、2を返す
		return 2;
	}

	// 正常に終了したので0を返す
	return 0;
}


閉鎖

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