fputsの戻り値について

解決


遊羅  2008-03-06 22:04:16  No: 67771

また、質問しにきました。
前回の改行についての続きなのですが・・・
保存するときに、バッファサイズ以上のものが入力されたとき、バッファサイズまでは保存して、それ以上は読み込まないようにしたいのです。

fputsの戻り値を使うのかな?とは思っているのですが・・・
恥ずかしながら、どう使えば良いのかわかりません。

どなたか、ご教授ねがえますでしょうか?
よろしくお願いします。


夏みかん  2008-03-07 00:34:13  No: 67772

保存するデータは前質問の続きと考え、
エディットボックスのテキストですか?

いろいろとあると思いますが
(1)...エディットボックスのテキスト量を取得
(2)...テキスト量に応じて動的にメモリを確保
(3)...エディットボックスからメモリに読み込む
(4)...一括ファイル保存
こんな感じかな。

数ある方法の一例。


そだ  2008-03-07 01:45:06  No: 67773

>保存するときに、バッファサイズ以上のものが入力されたとき、バッファサイズまでは保存して、それ以上は読み込まないようにしたいのです。

今どうやってられるのかわからないのですが、
もしGetDlgItemText関数のTCHARを引数とする方を使ってテキストを
取得しているのであれば、
バッファサイズをGetDlgItemText関数の第3引数として渡して
オーバーフローしないようにしているので特にfputsの戻り値を
使う必要はないのでは?
バッファサイズ以上に読み込まないようになっていると思いますよ。

>(2)...テキスト量に応じて動的にメモリを確保
バッファサイズを気にせずやりたいならCStringを引数とする
GetDlgItemText関数が用意されているようなので
そちらを使った方が楽かなーと思います。


PATIO  2008-03-07 02:12:04  No: 67774

基本的に前の質問の続きでも必要な情報は毎回提示すべきです。
毎回書くのがめんどうなら前のスレへのリンクくらいは置くべきだと思います。

> バッファサイズ以上のものが入力されたとき、
> バッファサイズまでは保存して、それ以上は読み込まないように
> したいのです。

バッファが何の事を指しているのか分からないのでバッファサイズというのが
何をする時に影響するのかが良くわかりません。
また、fputsはファイルに出力する関数なので話の内容からすると
見るべきところではないような気がします。

バッファを確保しているのは御自身のはずですから
バッファサイズも把握しているはずです。
エディットボックスから取得する時にバッファに入る分だけ
取得して取り込めば、言われている動作になるような気がします。


遊羅  2008-03-07 02:23:08  No: 67775

返事が遅くなりました。すいません。

夏みかんさん、そださん、ご回答ありがとうございます。
説明不足でもうしわけありません。

夏みかんさん
>エディットボックスのテキストですか?
そうです。
前回のソースを使い、一部だけ変えて作ろうと思っています。

>数ある方法の一例。
こちらは、個人的に考えたり調べたりして作ってみたいと思います。
ありがとうございます。

そださん
>もしGetDlgItemText関数のTCHARを引数とする方を使ってテキストを
>取得しているのであれば
との事ですが、GetDlgItemText関数は使っていますが、TCHARを引数とする方は使っていません・・・。

>バッファサイズを気にせずやりたいならCStringを引数とする
>GetDlgItemText関数が用意されているようなので
>そちらを使った方が楽かなーと思います。
実は、バッファサイズは300までという風に決められています。

ご回答くださりありがとうございます。
しかし、私の説明不足で申し訳ありません。
以下に、読込みのソースをはらせていただきます。

FILE *stream;
char line[100];
char buf[300]={0};
char file[MAX_PATH]={0};
int i = 0;

GetDlgItemText(IDC_EDIT2, file, MAX_PATH);
if(strlen(file) == 0)
  {
    AfxMessageBox("ファイル名を入力してください。\n");
    return;
  }
  if( (stream = fopen( file, "rb" )) != NULL )
  {
    while(fgets( line, 100, stream ) != NULL)
    {
      strcat(buf, line);
    }
    SetDlgItemText(IDC_EDIT1, buf);
    fclose(stream);
    }
    else
    {
    AfxMessageBox( "fopen 関数でエラーが生じました。\n");
    }
}

今のところ、こんな感じで作ってあります。
何かヒントがあれば、ご教授ください。
よろしくお願いします。


遊羅  2008-03-07 02:28:43  No: 67776

PATIOさん
>基本的に前の質問の続きでも必要な情報は毎回提示すべきです。
>毎回書くのがめんどうなら前のスレへのリンクくらいは置くべきだと思います。
ごもっともです。
申し訳ありません。

>また、fputsはファイルに出力する関数なので話の内容からすると
>見るべきところではないような気がします。
本当ですね・・・
基本がずれていました・・・

>エディットボックスから取得する時にバッファに入る分だけ
>取得して取り込めば、言われている動作になるような気がします。
バッファに入る分だけ取得ですね。
調べてみます。
ありがとうございました。


遊羅  2008-03-07 04:15:34  No: 67777

根本的に、質問が間違っていたので、解決とさせていただきます。

お答えいただいた皆様、ありがとうございました。


そだ  2008-03-07 09:36:05  No: 67778

本題が見えてきたのと危険に見えたソースがあったので
解決後に申し訳ないんですがちょいと上げ足。

>while(fgets( line, 100, stream ) != NULL)
>    {
>      strcat(buf, line);
>    }
もしstreamに300文字を超える文字が含まれたらbufが
オーバーフローするのでどうにかしようってことですね。
上記の代わりに
size_t n;
n = fread(buf, sizeof(char), 299, stream); 
buf[n] = '\0';
でどうでしょ。


遊羅  2008-03-07 19:49:54  No: 67779

そださん

ご回答ありがとうございます。
提示していただいたソースに置き換えたら、無事オーバーフローしなくなりました。
しかし、size_tやfreadなど使ったことが無く、理解できていません・・・。
ソースはコピーさせていただきましたが、理解するまで調べたいと思います。

ご回答くださった皆様、見当違いの質問ですみませんでした。
また、書き方も曖昧でわかりにくかったと思います。
それでも、回答してくださり本当にありがとうございます。
次からは、気をつけたいと思います。

また、何かありましたら書込みをさせていただくと思いますが、そのときはよろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加