アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になっております。
http://oshiete1.goo.ne.jp/qa3003394.html
上記URLで質問した者です(ご面倒だと思いますが少しご覧下さい)
おかげ様で無事解決し、大変良い勉強になりました。
今度は、

時刻表データを外部ファイルにして動作するようにしろ

と言う上司からの課題なんです。
各箇所にコメント付きの、サンプルソースを見せて頂けると
ありがたいのですが。。。
使ったことの無い関数(fscanf等)が多々出てきて、
期限が明日までということもあり、テンパッてしまっています。

入門書とにらめっこの日々が続いておりますが、
やはり独学では厳しいのでしょうか。。。

みなさんがどのようにしてc言語を覚えたのかも是非お聞きしたいです。

以上、よろしくお願いします。

A 回答 (4件)

★アドバイス


・期限が明日のようですが、fscanf() 関数を利用した参考になるページがあったので
 下の『参考URL』に貼っておきます。
 fopen、fscanf、fclose を使っています。
 かなり参考になると思いますので。
 どうぞ。→あとネットで検索すると結構、いいサンプルが見つかりますよ。

参考URL:http://www.geocities.jp/ky_webid/c/036.html

この回答への補足

お世話になってます。
int main(void)
{
char type;
int a, ret;
FILE *fp;

do {
fp = fopen( "jikoku.txt", "r" );
if( fp == NULL )
{
puts( "jikoku.txtが開けません" );
return 1;
}
// 上記の時点でファイルを開いている

static int table[] = { // 時刻表
// もしくはこの時点でファイルを開く?
};
int findtime; // 0000形式に変換後の現在時間
int *search; // テーブル内の検索時間
int h; // 時
int m; // 分

time_t timer; // 現在時刻を取得し地方形式に
struct tm *local;

time(&timer); // 現在時刻の取得

local = localtime(&timer); // 現在時刻を構造体に変換

h = local->tm_hour; // 時
m = local->tm_min; // 分

findtime = h * 100 + m ; // 現在時間を0000形式へ変換

for ( search = table ; *search != -1 ; search++ ) {
// ↑該当時間検索(このfor文も、時刻表を外部ファイル
    //  にしたことによって意味を成さなくなるのでは。。)
if ( *search > findtime ){
break;
}
}
// 結果表示
if ( *search == - 1 ) { // テーブル内の-1に当たった                  // ら06:10
printf( "06:10\n\n" );
}
else {
printf( "%02d:%02d\n\n",
(*search / 100), // 「時」取り出し
(*search % 100) ); // 「分」取り出し
}
scanf("%c", &type); // Enterで再度プログラム開始
}
    fclose( fp );
while (type == '\n');
}
・上記の箇所でファイルを開けていいのでしょうか?
 このようにして、開いたファイルが参照するテーブルとわかるので  しょうか

・fgets関数を使おうかと迷ったのですが、char型でないとだめなので しょうか?atoiを使用してint型に変換等の作業が必要なら、fscanf の方がいいのかとも思うのです。
 しかしfscanfで読み込む型の指定方法が難しくて。
 
 時間がある時にでもみなさんのご回答頂けたら幸いです。

補足日時:2007/05/18 14:10
    • good
    • 0
この回答へのお礼

本当にありがとうございます。

お礼日時:2007/05/18 10:06

すでに時間切れかもしれませんが…



・外部ファイルからデータを読めるようにして
・fsacnfを使う

という指定があるのなら、そのデータをどのように表記するかが
決まっているものと思いますがどうなんでしょうか?
fscanfということでバイナリということはまずないと思いますが、
たとえば

#時間 その時間の発着分
6 00 15 30 45
7 0 8 16 24 32 40 48 56
とか、
6:00, 6:15, 6:30, 6:45
7:00, 7:08, 7:16 ...
とか。
あ、ひょっとしてqa3003394 の配列要素の形式そのままですか?

それはさておき、具体的なアドバイスならいいでしょうけど
> と言う上司からの課題なんです。
> 各箇所にコメント付きの、サンプルソースを見せて頂けると
> ありがたいのですが。。。
というのは正直微妙な線だと思います。丸投げ一歩手前という意味で。
上司という言葉が出てくるのなら業務の一環でやっているのでしょうし、
どこかどのようにわからないかを明確にして、その人に訊くことも大切なんじゃないでしょうか。
もちろんその人も業務を抱えているのでいつ何時でも掴まえ手質問攻めにしていい
ということはないでしょうけど。



もし英語を苦にしない、英語でもかまわないというなら、
Google Code Search を使えば、Cのライブラリ関数なんかの使い方の実例は
それこそいくらでも見つかりますよ。
#今やってみたら定義がたくさん引っかかったのでちょっと工夫が要りました
http://www.google.com/codesearch?as_q=%3D+*fscan …


【ハウツー】これは便利! ソースをググれ - "Google Code Search" (1) Google、またも強烈な新サービス | エンタープライズ | マイコミジャーナル
http://journal.mycom.co.jp/articles/2006/10/06/g …

グーグル、コード検索の新サービス「Google Code Search」を発表 - CNET Japan
http://japan.cnet.com/news/media/story/0,2000056 …

参考にするにはいいでしょうが、仕事のコードに持ち込むときはライセンスに要注意ですよ。


> みなさんがどのようにしてc言語を覚えたのかも是非お聞きしたいです。
K&Rくらいしか本が出ていなかったので、そこに載っている問題などで。
フリーソフトウェアのソースを読みまくるってのもやりました。
今のとは違ってそれほど規模が大きくないものが多かったので全部読み通すのも
それほど苦にはなりませんでした。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。

形になったら、みて頂こうと思います。

お礼日時:2007/05/18 10:08

★アドバイス


・外部ファイルの内容はテキスト形式、バイナリ形式のどちらですか?
 これによっても使用する関数が異なりますよ。
・補足要求した『参考URL』にサンプルが載っています。
 ただし、fscanf() ではなく fgets() ですが…。
 ここの fgets() 部分を fscanf() に置き換えれば外部ファイルから時刻表の
 時間を取得できるはずです。まずは、ファイル形式をきちんと考えて、fscanf()の
 関数のマニュアルも読み試して見て下さい。そして、上手く期待した動作にならない
 ときに質問なんぞしてくださいね。
・下の『参考URL』に fscanf() 関数の解説ページを載せておきます。
 まずはご自分でソースを作成してみて下さい。
 以上。

参考URL:http://www.bohyoh.com/CandCPP/C/Library/fscanf.h …
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます!

そうですね、まずはなんとか自分でやってみます。

お礼日時:2007/05/17 22:32

★ファイルの読み書きは理解していますか?


・fscanf() 関数の前に fopen()、fclose() の関数の使い方はどの程度ですか?
 いきなりですが、補足要求します。
・でも、下の『参考URL』もどうぞ。

参考URL:http://www9.plala.or.jp/sgwr-t/c/sec17.html

この回答への補足

何度もありがとうございます。

fopen関数を使用して開き、そのファイルが無かったらNULLが返るというトコだけ理解できた段階です。

頂いたURLも見ました。
しかし、これを時刻表ソースにどう反映させるのかを考えております。

もっと勉強しなきゃだめですね。

補足日時:2007/05/17 18:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!