ファイル操作について – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

ファイル操作について

固定ページ 2 / 2

PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

苦言を呈するようですが、

実際にプログラミングする場合にどういう状況を想定するのかというのは
とても大切なことです。
仕様があいまいではプログラミングは出来ません。
その場合は、限定条件を作成する側で提示して、この条件下での正常動作を
想定しています。と言った出し方をします。
話を聞いていると中村さん自身、整理しきれていないように感じます。
この掲示板でいろいろ質問されて整理が出来てきていると言う状態では
ないでしょうか?
この辺は御自分でこういった問題の整理が出来るようにならないと
この先なかなか大変だろうなと感じました。
この辺は経験も必要だと思いますので、これに懲りずに頑張られる事を
お祈りします。

あと、各データ間の区切りがスペース一つに固定なのか、
スペースが複数入ることがあるのかでも処理が変わってきますし、
数値の桁数が何桁まで必要なのかとか、プログラミングするために
必要な情報と言うのはまだまだありますので、よく考えてプログラミングして
見てください。


返信引用
中村
 中村
(@中村)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

お世話になっています。

tibさんのアドバイスを受け、ソースを書き換えているのですが、以下の箇所のコードが
わかりません。
もし、よろしければご教授いただけないでしょうか。
>1行読み込んで何列あるか数える。
>列数分、ファイルポインタ型の配列を確保する。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

以下の箇所のコードがわかりません。
>1行読み込んで何列あるか数える。

ということは、その後にある、
> 空白文字をデリミタにして、1トークン切り出す。
は解るんですね? だったら、読み込んだ1行を1トークンずつ切り出してみて、何回切り出
せたかを数えればいいんです。

>列数分、ファイルポインタ型の配列を確保する。

これが解らないという事は、その後にある、
>ここままではメモリリークしてしまいますね。
も解ってないですね? これは「メモリの動的確保」と呼ばれる技です。「メモリの動的確
保」とか「動的なメモリの割り当て」といったキーワードで検索してみるといいでしょう。


返信引用
中村
 中村
(@中村)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

考えてはいたのですが、まったく進展がないです。
現状の私には難しすぎました。
上記のソースが精一杯です。
今後の勉強をかね、サンプルを教えていただけないでしょうか。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

せめて何をどう考えていたのか、だけでも見せてくれませんか?

例えばこんなソースにしてみたけどやっぱりダメでこんな風になってしまうとか、私が提
示したキーワードで検索して見つけたサイトのURLとそのサイトの説明のどこまでが理解
できてどこからが理解できなかったのかとか。

Cのプログラミングなんて、考えているだけじゃどんなに頑張ってもできませんよ。関数
のリファレンスを首っ引きになって自分がやりたい事はどの関数とどの関数をどう組み合
わせればいいのか、ってことを調べ上げないと。


返信引用
中村
 中村
(@中村)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

tibさんがおっしゃるとおり、この部分も良くわかっていません。
特に1トークン切り出し、数を数えるという部分が良くわかりません。
>空白文字をデリミタにして、1トークン切り出す。
>切り出したトークンを、然るべき出力用ファイルに出力する。
調べているのですが、それにまつわるような例がなく、困っています。
以下のように整理のできない無茶くちゃなソースになっています。

#include stdafx.h

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

#define LEN_BUFF 512 /* 変更するバッファのサイズ */

void main(void)
{
FILE *fp;
int c;
char *buff;
char *tp;

if ((fp = fopen(test.txt, r)) == NULL) {
fprintf(stderr, ファイルを開くのに失敗しました!\n);
exit (2); /* 失敗したらシェルに戻る */
}

setbuf(fp, NULL);

/* バッファ用のメモリを割り付け */
buff = (char *)malloc(LEN_BUFF);

setbuf(fp, buff);
printf( \n );
printf( ********* バッファリング有り *********\n);

while ((c = fgetc(fp)) != '\n' ) /* EOF に達するまで、 */
putchar(c); /* ファイルの中身を1字ずつ表示 */

//トークンに利用
//空白文字をデミリタに一トークン切り出す?
printf( \n );
tp = strtok(buff, \n );
puts( tp );
while ( tp != NULL ) {
tp = strtok( NULL,\n );
if ( tp != NULL )
puts( tp );
}

fclose(fp);

free(buff); /*メモリを解放 */

}


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

プログラミングは、
自分がやりたいことをコンピュータ上でどうやって実現するのかと言うことに尽きます。
だから、自分がやりたいことをきちんと把握できていること。
やりたいことをコンピュータにやらせるとしたらどうしたら良いのか。
一つ一つの処理はどういうことをしていくのか。
その処理を行うのに最適な関数は無いのかを探す。
関数が無ければ、ロジックそのものを自分で記述する。
と言ったことが必要になります。

極端な話、効率を無視するなら全ての処理を自前で書いてしまえば、
標準関数は使用しなくてもプログラムが出来る理屈です。
但し、こんな効率の悪いことは普通しませんし、
標準関数として用意されている物であれば、
特に使用を避けたほうがいい関数を除いて使ったほうが遥かに効率が良いです。

既にロジックはtibさんが示してくれていますし、
途中まででもコードを書いたのであれば、それを提示してアドバイスを受けた方が
良くないですかね。
せっかくロジックまで示してくれているのに、最初の段階まで逆戻りと言うのは
もったいなくないですか?


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

あらら、ニアミスでしたね。


返信引用
西園寺
 西園寺
(@西園寺)
ゲスト
結合: 21年前
投稿: 2
 

中村さんはいっぺんに全部やろうとして混乱してるようですね。
今までのコードはいったん忘れて、まずは以下のプログラムを
1個ずつ作ってみてはいかがでしょ。

(1)入力ファイルを1行ずつ読込み、画面(標準出力)に表示するプログラム

(2)入力ファイルを1行ずつ読込み、出力ファイルに書き込むプログラム

(3)入力ファイルを1行ずつ読込み、1行ずつ別の出力ファイルに書き込むプログラム
  (例)
   1行目はline1.txt
   2行目はline2.txt
     :
   N行目はlineN.txt

(4)入力ファイルを1行ずつ読込み、トークンにばらして1トークンずつ
  別の出力ファイルに書き込むプログラム
  (例)
   1行目の1個目のトークンはline1-token1.txt
   1行目の2個目のトークンはline1-token2.txt
     :
   N行目のn個目のトークンはlineN-tokenn.txt

こんな感じで、少しずつ関数や文字列の扱い方を覚えていくといいです。
焦らず、根気よくいきましょう。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました