OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

テキスト処理したいのですが

  • すぐに回答を!
  • 質問No.210475
  • 閲覧数96
  • ありがとう数0
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 18% (7/37)

テキストの例えば5文字目から10文字目を切り出して新しいテキストファイルに保存したいのですがなにかいい方法はありますか
C言語初心者なのですみません。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル9

ベストアンサー率 38% (24/62)

こんにちわ

まず、読み込むテキストデータですが、
これは「改行」交じりのデータですか?
それとも、1行目にずらずらーっとデータが羅列されているタイプでしょうか?

後者の場合、「バイナリモード」での読み込みのほうが適しているかもしれません。
inStream = fopen( INFILE, "rb")

次に、抽出したい項目の位置ですが、それは固定ですか?
固定で無い場合は「strstr」と言う関数で抽出場所を探す必要があります。
p = strstr( src, "S1100")

で、実際の抽出方法ですが、
まずは「fseek」と言う関数でデータを見る場所を設定します。
fseek( inStream, 200, SEEK_SET); // 先頭が0になります
SEEK_SETは「ファイルの先頭から」と言う意味です。
#strstrを使った場合は「fseek( inStream, p, SEEK_SET)」です

次に、その位置からデータを必要な分だけ抽出します。
fgets( src, 6, inStream);
#たしか、必要な文字数+1を指定する必要があったようなないような・・・

自動で「\0」は付けてくれないので、自分で付けます。
src[5] = '\0';

あとはこのsrcの中身を書き出せばOKです。

[指摘]
1.kewaさんのソースにはファイルを書き出す部分が見当たりませんが、
これは単なる書き忘れ?
2.srcの領域が確保されていませんので、fgetsの部分でエラーが出るかと思われます。
char src[256];
などにしておかないとマズイですね。

さて、こんな説明で分かりましたでしょうか?
補足コメント
kewa

お礼率 18% (7/37)

ありがとうございます。試してみたら、うまくいきました。
ただ、固定長データは、改行まじりで、あのデータが何行も
あって、同じ部分をEOFまで繰り返し抜き出す処理をした
いのですが、いい方法はありますか?

ご指摘のファイルを書き出す部分は、fputs関数を書きました。
投稿日時 - 2002-02-04 22:08:28
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル9

ベストアンサー率 33% (33/98)

分からないのは「テキストファイルから読み出す」?、「5文字目から10文字目を切り出して」、「新しいテキストファイルに保存」のどれかですか?それとも全てでしょうか? 問題を絞り込まれた方が良いです。 さもないと、望まれた答えが返ってこないかも知れません。 とりあえず、書いてみます。分からないところやはずしているところがあれば、補足をお願いします。 > 5文字目から10文字目を切り出して ...続きを読む
分からないのは「テキストファイルから読み出す」?、「5文字目から10文字目を切り出して」、「新しいテキストファイルに保存」のどれかですか?それとも全てでしょうか?
問題を絞り込まれた方が良いです。
さもないと、望まれた答えが返ってこないかも知れません。
とりあえず、書いてみます。分からないところやはずしているところがあれば、補足をお願いします。

> 5文字目から10文字目を切り出して
#inlcude <string.h>
と先の方に書いておいて、(strncpy利用のため)

src に元の文字列が入っているとすると、

char dst[6]; // 5文字+\0 で6文字分
strncpy(dst, src+5, 5); // 切り出す
dst[5] = '\0';

の様にします。

>新しいテキストファイルに保存
#include <stdio.h>
と先の方に書いておいて(fxxxx利用のために)

FILE *fp;
if ((fp = fopen("out.txt", "w")) == NULL) { // out.txt にファイル名
// 開けなかったときのエラー対策
perror("can't open file!");
return;
}
fputs(str, fp); // str は書き込む文字列
fclose(fp);

参考URLで関数の解説が検索出来ますので分からない関数は調べてみてください。
補足コメント
kewa

お礼率 18% (7/37)

試してみました。
わからないのは切り出す部分です。
テキストは固定長データです。たとえば、
200,20011108A 10ム011108 5208A 000AB857840110000010001000010000000000001570000000000000000000000000157956441195131418520011108S1100000000000000000000000000000000000000000000000000000000000000000000000000
というデータから'S1100'という部分だけを切り出したいのですが。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define INFILE "deta1.txt" /* 入力ファイル名 */
#define OUTFILE "kekka.txt" /* 出力ファイル名 */

int main(void)
{
int d;
char dst[6];
char *src;
FILE *inStream, *outStream;

/* 入力用ファイルのオープン */
if ((inStream = fopen(INFILE, "r")) == NULL) {
printf("ファイル%sがオープンできません。\n",
INFILE);
exit(1);
}

/* 出力用ファイルのオープン */
if ((outStream = fopen(OUTFILE, "w")) == NULL) {
printf("ファイル%sがオープンできません。\n",
OUTFILE);
exit(1);
}

while((*fgets(src,200,inStream)) != EOF) {
strncpy(dst, src+10, 5); // 切り出す
dst[5] = '\0';
}

/* ファイルのクローズ */
fclose(outStream);
fclose(inStream);

return 0;
}
というコードを書いてみましたが、うまくいきません。教えてください。
投稿日時 - 2002-02-03 22:47:47
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ