
計測器からのデータを取得してテキストファイルに書き込みたいのですが、
1)ファイル名を取得された時刻にしたいのですがどのようにしたらいいのでしょうか?fp=fopen("D:\\trace.txt","w");中のtraceの所をかえたいです。 時刻は日時の関数を使えばいいと思いますがファイル名をどのようにしたらよいか・・・
2)計測器から取得されるデータを時間ごとにファイルを作成したいのですがどのようにしたらいいのでしょうか?あらかじめファイルポインタを用意しておくと膨大の数が必要となってしまうのでどうしたらよいか・・・
3)仮に時間ごとに作成したファイルを読み込むにはどうしたらよいでしょうか?
例えばfp=fopen("D:\\2008_01_12:00","r");のように直接パスを入力すれば読み込めると思いますが任意のファイル名だといまいち分からないです。
No.1ベストアンサー
- 回答日時:
#include <stdio.h>
#include <time.h>
char *MakeFileName(char *FileName, char *BasePath, char *BaseName, char *FileExt)
{
time_t timer;
struct tm *t_st;
/* 現在時刻の取得 */
time(&timer);
/* 現在時刻を構造体に変換 */
t_st = localtime(&timer);
sprintf(
FileName,
"%s%s%04d_%02d_%02d_%02d%02d%s",
BasePath,
BaseName,
t_st->tm_year+1900,
t_st->tm_mon+1,
t_st->tm_mday,
t_st->tm_hour,
t_st->tm_min,
FileExt);
return FileName;
}
int main(void)
{
char WriteFileName[FILENAME_MAX];
FILE *ifp;
// 2009年1月24日午前1時42分に、D:\temp\file2009_01_24_0142.txtをオープンする
ifp = fopen(MakeFileName(WriteFileName,"D:\\temp\\","file",".txt"),"w");
if (!ifp) {
printf("ファイル\"%s\"が開けません\n",WriteFileName);
return 0;
}
// 以下略
なお、Windows環境のfopen関数で「ファイル名8文字+拡張子3文字」を超える長いファイル名でオープンが出来るかは不明。
No.3
- 回答日時:
《確認事項》
1)
「計測器からデータ」を、RS232C等を用い、パソコンで取得するのですよね。
そのサンプリング時間(取得間隔時間)毎に、
・ファイルを作成する。
・ヘッダに時刻を付けた「レコード」を作成し、ファイルに蓄積(追加)する。
質問文からは、前者(1ファイル/サンプリング時間)と思われますが、正しいですか?。
------------------------------------------------
《アドバイス》
前者として、
>時刻は日時の関数を使えばいいと思いますがファイル名をどのようにしたらよいか・・・
サンプリング時間で、複数のファイルが区別できさえすれば、自由かと・・。
というか、不適切に同名でオープン( "w" )すれば、新(さら)にされちゃう。
例)サンプリングが1分のとき、ファイル名に「時・分」は必須で、「秒」は不要。
「時」だけだったら59分に作ったファイルだけが残る。
(年・月・日が必要な場合も・・)
2)
>あらかじめファイルポインタを用意しておくと膨大の数が必要となってしまうのでどうしたらよいか・・・
取得済みの都度、クローズすれば、ひとつでよいかと・・(そのときのファイル名は、下のように文字列で)。
3)
>例えばfp=fopen("D:\\2008_01_12:00","r");のように直接パスを入力すれば読み込めると思いますが任意のファイル名だといまいち分からないです。
・「直接」でなく、「ファイル名を文字列で作って」オープンすればいいのでは・・。
例えば char cFname[ 64 ]; としておき(年別のディレクトリに月・日の例)、
for( iYear = 2008; iYear < 2010; iYear++ ){
for( iMon = 1; iMon <= 12; iMon++ ){
for( iDay = 1; iDay <= 31; iDay++ ){
sprintf( cFname, "D:\\data%d\\%02d%02d.csv", iYear, iMon, iDay );
fp = fopen( cFname, "r" );
if( NULL == fp ) continue;
・・・読込
ありえない D:\data2008\0231.csv は(当たり前ですが)オープンできず、「正常」に次の3月1日へとループが進みます。
No.2
- 回答日時:
ANo.1では、1)、2)しか回答してなかったです。
3)をやるには
パス位置、ファイル名のベース、年月日時分、拡張子を与えて、該当ファイルを検索する必要があるでしょう。
ファイルの検索は
http://www.geocities.jp/ky_webid/win32c/054.html
を参考に
・FindFirstFileで"D:\\temp\file????_??_??_????.txt"の検索を開始
・見付かったらファイル名から年月日時分を取り出す
・処理すべき年月日時分のファイルなら、何かの処理
・FindNextFileで次を検索
・それ以上見付からなかったらFindCloseで検索を終わる
と言う処理をして下さい。
検索するファイルを"D:\\temp\file2009_01_24_????.txt"にすれば「2009年1月24日のだけ」を探せます。
検索するファイルを"D:\\temp\file2009_01_24_14??.txt"にすれば「2009年1月24日の14時台のだけ」を探せます。
なお「作成した日付順にファイルが見付かるとは限らない」ので注意して下さい。見付かる順は「ディレクトリエントリの順」です。
ディレクトリエントリは「前の方に空きがあれば、新しいファイルは、その空きに作られる」ので、順番は「ほぼ、ランダム」です。
また「エクスプローラの表示順番」は「何らかのキーで並び替えされてる」ので、アテになりません。
なお「Windowsファイルシステムで、ルートディレクトリ(C:\とかD:\とか)に大量のファイルを作ると、ファイルシステムが致命的にクラッシュする場合がある」ので、やってはいけません。
(WindowsXPでC:\に「32個以上のファイルを作る」と場合によってはXPが起動しなくなります)
また
>例えばfp=fopen("D:\\2008_01_12:00","r");のように
ファイル名中に「:」は使えません。
回答が遅くなってすいません。
サンプルプログラムを理解するのに時間がかかりましたが、無事に取得することができました。
>>WindowsXPでC:\に「32個以上のファイルを作る
もう少しでパソコンを壊すところでした貴重な意見ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- その他(開発・運用・管理) おんどとりWebStorage APIから温度情報を取得し表示したい 2 2023/08/03 09:53
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0バイトのテキストファイル
-
ファイル内容を比較する方法
-
C#でtiffファイルのページ数を取得
-
VBAで、JPG写真の撮影日時を読...
-
【Excel VBA】取り込んだファイ...
-
【VBA】印刷マクロのループ処理...
-
サイトマップにサブドメインを...
-
VB6でTIFF図のプロパティを...
-
VB2008 iniファイルの全セクシ...
-
Eclipseで検索ができなくなった
-
画像ファイルに拡張子がjpgのフ...
-
リソースファイルを認識してく...
-
C#について質問【複数の.datフ...
-
includeで別サイトを読み込む
-
VSSでチェックアウトの取消をし...
-
ファイル名を任意の名前に作成...
-
C++.NET 2003 「空のドキュメ...
-
【VBA】複数CSVの特定範囲を1つ...
-
BASP21のファイルアップロード...
-
ファイル更新日取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
Eclipseで検索ができなくなった
-
0バイトのテキストファイル
-
VBAで、JPG写真の撮影日時を読...
-
HTMLテキストリンクでExcelファ...
-
ファイル作成日時と更新日時を...
-
main関数のコマンドライン引数...
-
2GB以上のファイルを扱う方法
-
C++によるファイル送受信プログ...
-
【VBA】複数CSVの特定範囲を1つ...
-
BASP21のファイルアップロード...
-
HTMLまたはJavaScriptでフ...
-
サイトマップにサブドメインを...
-
VB6.0のメモリリークについて
-
ファイルの排他について
-
File.Create で作成に失敗した場合
-
ファイル更新日取得
-
VSSでチェックアウトの取消をし...
-
VBS ファイルマージ処理
-
ディレクトリのサイズの取得
おすすめ情報