ページ 1 / 1
文字の扱いについて
Posted: 2009年4月18日(土) 20:52
by 文字の扱いについて
以下のソースで書き込めないのですが
おかしいのでしょうか?
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"); // エラー処理
}
Re:文字の扱いについて
Posted: 2009年4月18日(土) 21:13
by kazuoni
まずこれだとコンパイルすら通らないですよね?
まずはそれからだと思うのですが・・・
もし、上のコードがコンパイルが通るコードからの抜粋だとしたらの話ですが、
fprintf(fp, "%s",Text);
で試してみてください。
Re:文字の扱いについて
Posted: 2009年4月18日(土) 21:14
by lbfuvab
それでは'あ'の一バイト目をかきこんでいるだけです。
fprintfやfputsでググると良いでしょう。
Re:文字の扱いについて
Posted: 2009年4月18日(土) 21:15
by SooA
詳しくは printf関数に関して調べてみてください。
fprintf( fp, "%s", Text ) ;
または
fprintf( fp, Text ) ;
Re:文字の扱いについて
Posted: 2009年4月18日(土) 21:18
by あ
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"); // エラー処理
}
}
で試したのですが強制終了してしまいます・・・。
Re:文字の扱いについて
Posted: 2009年4月18日(土) 21:30
by kazuoni
>あさん
トピ主さんですか?
もしそうだとしたら名前は統一してください。
誰が質問者か分からなくなってしまいます。
まずは
・プロトタイプ宣言
・文字列処理(ポインタ)
を復習されてはいかがでしょうか?
また、lbfuvabさんの助言をよく考えてみてください。
Re:文字の扱いについて
Posted: 2009年4月18日(土) 21:41
by バグ
ファイルオープンに失敗した場合も処理を続行していますが、それは意図的に行なっているのでしょうか?
Re:文字の扱いについて
Posted: 2009年4月19日(日) 17:47
by スレ主です
皆様、返信ありがとうございます。
いろいろなサイトで勉強し下記のようにソースを変えました。
書き込みではなんとかできるのですが
読み込みでエラーが起こります。
どこが間違えているのか指摘していただけないでしょうか?
#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:文字の扱いについて
Posted: 2009年4月19日(日) 17:48
by スレ主です
>>バグさん
ごめんなさい・・・
意図的に行っているつもりはないのですが
どうすればよいのかわかりません・・・・。
Re:文字の扱いについて
Posted: 2009年4月19日(日) 18:30
by array
> 読み込みでエラーが起こります。
読み込みは、fscanf()ではなく、fgets()を使えばいいと思います。
Re:文字の扱いについて
Posted: 2009年4月19日(日) 19:11
by スレ主です
>>arrayさん
fgetsを使ってみたのですが
要素?の調べ方がわからずエラーが出てしまいます。
fgets(文字配列,配列の要素数,ファイルポインタ);
らしいのですが
配列ではないので理解できませんでした・・・。
Re:文字の扱いについて
Posted: 2009年4月19日(日) 19:12
by バグ
fscanf自体は問題ないのでは?
それよりも問題なのは、書き換え不可能なTextというポインタ変数が指している領域を書き換えようとしている点ではないでしょうか?
char buf[1024];
ReadFile(buf);
とでも書き換えればいいかと。
Re:文字の扱いについて
Posted: 2009年4月19日(日) 19:14
by kazuoni
名前は
文字の扱いについて
さんで固定したほうがいいですよ。投稿者がその名前なので。
とりあえず原因は
書き込めないところに書き込もうとしているのが理由です。
ReadFile()では
char *Text = "あいうえお";
の先頭のアドレスを引数として渡しています。
そのアドレスで引数strは初期化されています。
fscanf(fp, "%s", str);
では、strに読み込んだ文字を代入しようとしています。、
もともとstrはグローバル変数Textで初期化されたのですが、
Textはchar型の配列ではなく、char型のポインタのです。
なので、代入はできません。
解決策としては、ReadFile()中で、新たにchar型の配列を用意し、
あらかじめすべてnullで初期化します。
あとはそこにfscanfで代入してやれば一応は解決します。
訂正
4/19 21:25
誤った回答だったので、打ち消し線を引かせていただきました。
Re:文字の扱いについて
Posted: 2009年4月19日(日) 19:16
by kazuoni
そして、バグさんともろかぶりました・・・w
バグさんと言いたいことは全く同じでした^^;
Re:文字の扱いについて
Posted: 2009年4月19日(日) 20:21
by Mist
> では、strに読み込んだ文字を代入しようとしています。、
> もともとstrはグローバル変数Textで初期化されたのですが、
> Textはchar型の配列ではなく、char型のポインタのです。
> なので、代入はできません。
この部分の説明は的外れだよ。
Textの指し示す先が文字リテラルであるからダメなのであって、charのポインタだから代入できないってのは意味不明です。
Re:文字の扱いについて
Posted: 2009年4月19日(日) 21:16
by kazuoni
>トピ主さん
自分の理解が浅い時に回答してしまい大変申し訳ありませんでした。
Mistさんの回答を参考にしてください。
>Mistさん
自分でも書いていてちょっと変だなっと思ってました。。
回答を控えるべきでした。
文字列リテラルがコンパイル後に(環境依存ですが)ROM領域に生成
されるっというのは知りませんでした。。
ご忠告本当にありがとうございました。
Re:文字の扱いについて
Posted: 2009年4月20日(月) 11:15
by バグ
トピ主さんのソースを元に、私の好みの書き方で書きなおしてみました。
黒文字で書いていますので、どうしても分からない場合にだけ、反転させて御覧ください。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;
}