* * 固定文字 * ファイル名1 * [改行]
* * 固定文字 * ファイル名2 * [改行]
・・・(以下同様)
上のようなテキストファイルがあります。
これのファイル名1,2,...だけ取り出して
別のファイルに保存したいのですが、
どのようにすればよいでしょうか?
*は文字数が変わる文字列を意味します。
*はスペースを含みません。
ファイル名は文字数が変化し、その前後には
スペースが入ります。
固定文字はどの行も同じ文字が入っているので
これを基準に、プログラムを書けばよいと
思うのですが、分かりません。
No.4ベストアンサー
- 回答日時:
フォーマットが決まっているスペース区切りのデータファイルを扱う時は、fgets で1行読み込み、sscanf で必要な部分を取り込むのがセオリーです。
while (fgets(buf, buf_size, fin)) {
sscanf(buf, "%*s %*s %*s %*s %s", filename);
fprintf(fout, "%s\n", filename);
}
※buf, filename は char配列として、それぞれに十分なサイズを取ってください。
※buf_size には、buf の長さを指定してください。
※fin, fout は、それぞれ読み込むファイル、ファイル名を出力するファイルのファイルポインタです。
sscanf のフォーマット指定の %*s は、そのデータは読み飛ばす(変数に格納しない)という指定です。
先頭から4個分の文字列を読み飛ばし、5番目のファイル名を filename に読み込みます。
fgetsとsscanfでこんなに簡単に実現できるんですね。
このプログラムで、思いどうりのことが出来ました。
ご回答ありがとうございます。
No.5
- 回答日時:
自分ならこうする。
#include <stdio.h>
#include <string.h>
#define BUFSIZE 1024 // 数は仮
....
FILE *infd, *outfd;
char *p, *pp, buf[BUFSIZE+1],
*str=" 固定文字 "; // 前後にspaceを付ける
....
/* file open 省略 */
/* 以下、インデントは全角スペースなので要注意 */
....
while(fgets(buf, BUFSIZE, infd)){
if ((p = strstr(buf, str)) != NULL){
p += strlen(str);
if ((p = strchr(p, ' ')) != NULL){
p++; // ファイル名の先頭
if ((pp = strchr(p, ' ')) != NULL){
*pp = '\0'; // buf 破壊
// 書き出し方は仮
fprintf(outfd, "%s\n", p);
}
}
}
} // while(fgets(...)) exit
....
/* file close 省略 */
....
または、DOS コマンドライン分解ルーチン getarg() が
あるなら、buf をこれに通すと、argv[4] がファイル名を
指すので、これを書き出す。
argc >= 6 を条件にする。
プログラム的にポインタを使用しているようで
私には難しすぎますが、他の方の参考になると思います。
ご回答ありがとうございました。
No.3
- 回答日時:
もしも、ファイル名の前後以外のところに1つも
スペースが入らないのであれば、
1行読み込み→1文字ずつスペースと比較(スペースで
なければ次の文字へ)→スペース文字があったら、
(次のスペースがくるまで)それ以後の文字を
別の文字列にコピー→次のスペースがきたらその行の
処理は終了→次の行の処理へ
と繰り返せばできるかも。
もっと楽なやり方があるかもしれませんが、
ご参考までに。
No.2
- 回答日時:
*がスペース以外のどんなものにでもなるのなら、
固定文字列と重なるかもしれないので他のものを
基準にしたほうがいいです。
区切り文字が半角スペースで、他部には使われてい
ないとすれば、4つ目のスペースの直後から次のス
ペースまでと見て1行毎の文字列の頭から検索すれ
ばいいと思います。
僕はVCでログファイルを作るときには、
fopen(),fseek(),fgets(),fputs(),fclose()
をよく使ってます。
No.1
- 回答日時:
考え方としては、fgetsで1行読み込んで、strstrで固定文字を検索し、ファイル名の先頭位置を検索し、切り出す。
なんだろうけど、固定文字とファイル名の間と、ファイル名と改行の間に*があるからだめなんじゃない?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) excelにて、特定の列に数字入力してあれば、入力してある行コピーして 別ファイルに張り付ける 2 2022/08/11 05:33
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) vbaサブフォルダーをワイルドカードで取得したい 2 2022/11/15 08:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CString型 全角半角を意識せず...
-
エクセルで13,410円を数値の134...
-
VBからID3タグをいじる方法
-
ワードのVBAで
-
VB6のテキストボックスに入力し...
-
EXCELのVBAでLenB関数について
-
【Excel VBA】セル内テキストの...
-
エンコード・デコードの仕方
-
VB.NET ListBox内の前方一致で...
-
「シフトJIS X 0213」形式の文...
-
文字の並び替え
-
TextFieldParserの固定長桁数を...
-
VB6.0 改行コードのないファイ...
-
アクセス ステータスバーの文...
-
機種依存文字と特殊文字について
-
文字列から、null値を除去する方法
-
VBA 変数名に変数を使用したい。
-
2の補数の計算について
-
WORD VBA プログラム修正をお願...
-
AccessのDAOでフィールド名を配...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CString型 全角半角を意識せず...
-
EXCELのVBAでLenB関数について
-
ファイル名の一部削除について
-
文字列から、null値を除去する方法
-
TextFieldParserの固定長桁数を...
-
StrConvでUnicodeに変換出来な...
-
一番右のスペース以降の文字列...
-
VBScriptで半角カナと半角英数...
-
【Excel VBA】セル内テキストの...
-
アクセス ステータスバーの文...
-
「シフトJIS X 0213」形式の文...
-
WSTRINGとは?
-
エクセルで13,410円を数値の134...
-
VBからID3タグをいじる方法
-
VB6のテキストボックスに入力し...
-
HEX
-
指定バイト目を取り出すにはど...
-
C言語とWin32APIで全角かなの...
-
vb2008 MIDB関数
-
ASC関数
おすすめ情報