テキストの例えば5文字目から10文字目を切り出して新しいテキストファイルに保存したいのですがなにかいい方法はありますか
C言語初心者なのですみません。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんにちわ



まず、読み込むテキストデータですが、
これは「改行」交じりのデータですか?
それとも、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];
などにしておかないとマズイですね。

さて、こんな説明で分かりましたでしょうか?

この回答への補足

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

ご指摘のファイルを書き出す部分は、fputs関数を書きました。

補足日時:2002/02/04 22:08
    • good
    • 0

分からないのは「テキストファイルから読み出す」?、「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で関数の解説が検索出来ますので分からない関数は調べてみてください。

参考URL:http://www.linux.or.jp/JM/

この回答への補足

試してみました。
わからないのは切り出す部分です。
テキストは固定長データです。たとえば、
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
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

QC言語の初心者の中の初心者です

フリーのコンパイラをとったのですが、バッチ、ファイルとして認識されまえせんとか指定されたファイルが見つかりませんと表示されます。どこからダウンロードしたのか忘れてしまいましたが、インターネットソース名はcmdとなってます。
Microsoft windows XP[Version5.1.2600]
(C)Copyright 1985-2001 Microsoft corp.
C:\Documents and settings\yuki>
上のプログラムが表示されてるのですが >のあとに何と打ち込めばいいのでしょう?yukiはこのパソコンに入れた名前です。#include <stdio.h>
        main()
{
printf("abcde\n");
}
などと入力してみましたがファイルが見つからないとか出てしまいました。何か必要なプログラムがあるのでしょうか?

Aベストアンサー

C言語の前に先ずはコンパイラって何、という知識はあった方が良いですね。
とりあえずGNUプロジェクトのCygwinを入れてみてはどうでしょうか?
CygwinとはWindows上でUNIXコマンドが利用できるソフトで、
gccというコンパイラもインストールオプションで入れる事が出来ます。
インストール後は、Cygwinコンソール上から、
$ gcc hogehoge.c
でコンパイルが出来ますよ。
またわからない事がありましたら、補足で質問してください。

参考URL:http://cygwin.com/

QC言語でのUTF-8の文字列の処理は例えば、比較とかstrtokとかはどうするのか

大量のhtmlファイルを処理をする様になってから今迄はperlを使って来
たが処理が遅いのでC言語を使って早くしようと思って要るが。肝心の
日本語コードの扱いで詰まっている。

例えば、
<!--コメントヘッダーのはじまり-->
.
.
.
<!--コメントヘッダーのおわり-->
と言った場合に、<と>に囲まれた色んなタグが現れて来る。strtokで文
字列を拾って対処をするとしても、文字コードが処理出来なければ何も
進まない。

例えば、上記の場合でhtmlファイルを読んでコメントヘッダーのはじまり
とおわり迄に関しては、出力をしない。他のは全て出力すると言う様な場
合のC言語のソースはどの様に成るのでしょうか。

済みません。未だ、始めたばかりでC言語での記述が出来ません。宜し
く回答願います。

回答はヒントでは無くて直接のC言語のソースを提示願います。宜しく
お願いします。

Aベストアンサー

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られたバッファでやりくりしようとするなら(ネットワークからダウンロードしながら処理する際にはこのやり方が必須)、バッファ読み込みの際のタグ文字列の泣き別れなどを考慮する必要がありちょっと凝ったテクニックが必要になります。

それとも、UTF-8で書かれたHTMLの"<!--コメントヘッダーのはじまり-->"~"<!--コメントヘッダーのおわり-->"を全削除ですか?だったら、コードをUTF-8で書いて、strstr()で"<!--コメントヘッダーのはじまり-->”を見つけて・・・でいけると思います。文字コードの処理というよりか、見る人が見れば日本語に見えるかもしれない「ただのデータの列」とみなして処理するだけです。

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られた...続きを読む

QC#での自作DLL(C言語)の並列化

C言語で自作したDLLをC#で使いたいと考えております。
このDLLの計算量は多くて、値を返すまでに時間がかかります。
そのためにC#のフォームが応答なしになってしまうので並列化したいと思ったのですがうまくいきませんでした。
このDLLは
・int型の戻り値
・6個の引数
・上の引数のうち、1つはoutキーワード(ポインタ渡し)
です。
どのようにすれば、うまく並列化できるでしょうか。
ご教授お願いいたします。

Aベストアンサー

やりたいことが
C言語側の関数を分割・並列処理化しての処理時間短縮なのか、
単にC#側でUIをブロックしないように時間の掛かる処理を非同期に実行したいのか、
が、いまいち読み取れませんでした。

おそらく後者であろうと想定して、
C言語の関数が特に処理の途中中断などをサポートしていないと想定して、
C#はv3.0以降(VisualStudio2008以降)であると想定して、
C#側のGUIはWindows Formsであると想定して、
以下に2例ほど、時間の掛かる処理を非同期に実行する例を記載します。

いずれも、longTimeOperation()の呼び出し部分が時間の掛かる処理を呼び出す部分です。
また、あくまで例なので、処理中のGUIの設定や表示などもあわせて、
適当に読み替えてください。


■スレッドプールのスレッドを利用した例

private void button1_Click(object sender, EventArgs e)
{
// フォームクローズを拒否するデリゲート。
FormClosingEventHandler closeGuard = (s, a) => a.Cancel = true;

// 別スレッドでの処理が終わるまでの状態設定など。以下は一例。
this.button1.Enabled = false;
this.FormClosing += closeGuard;

var calcResult = 0;
var dataArea = new byte[1024];

ThreadPool.QueueUserWorkItem(_ =>
{
// ここで時間の掛かる処理を呼ぶ
calcResult = longTimeOperation(out dataArea);

// 処理中の状態を戻すための処理をメイン側に委譲
this.BeginInvoke(new MethodInvoker(() =>
{
this.FormClosing -= closeGuard;
this.button1.Enabled = true;

// 必要なら後処理など
if (calcResult != 0)
{
// ・・・
}
}));
});
}

■BackgroundWorkerを利用した例
 
private void button2_Click(object sender, EventArgs e)
{
var calcResult = 0;
var dataArea = new byte[1024];

// 「WaitingForm」は、処理完了待ち中に表示する自作の適当なフォーム。
// PictureBoxにアニメーションGIFでも載せておくなどすれば良いかも。
using (var bgWorker = new BackgroundWorker())
using (var waitingForm = new WaitingForm())
{
bgWorker.WorkerReportsProgress = false;
bgWorker.WorkerSupportsCancellation = false;
bgWorker.RunWorkerCompleted += (s, a) => waitingForm.Close();
bgWorker.DoWork += (s, a) =>
{
// ここで時間の掛かる処理を呼ぶ
calcResult = longTimeOperation(out dataArea);
};

waitingForm.Load += (s, a) => bgWorker.RunWorkerAsync();
waitingForm.FormClosing += (s, a) => a.Cancel = bgWorker.IsBusy;

waitingForm.ShowDialog();
}

// 必要なら後処理など
if (calcResult != 0)
{
// ・・・
}
}

やりたいことが
C言語側の関数を分割・並列処理化しての処理時間短縮なのか、
単にC#側でUIをブロックしないように時間の掛かる処理を非同期に実行したいのか、
が、いまいち読み取れませんでした。

おそらく後者であろうと想定して、
C言語の関数が特に処理の途中中断などをサポートしていないと想定して、
C#はv3.0以降(VisualStudio2008以降)であると想定して、
C#側のGUIはWindows Formsであると想定して、
以下に2例ほど、時間の掛かる処理を非同期に実行する例を記載します。

いずれも、longTimeOperation...続きを読む

QC/C++言語で変数名から変数のアドレスを取得する方法があれば、ご教示願います。 例えばですが、関数

C/C++言語で変数名から変数のアドレスを取得する方法があれば、ご教示願います。

例えばですが、関数GetProcAddress()は、関数の文字列からエクスポート済みの関数のアドレスを戻り値で返しています。
GetProcAddress()と同じようにアドレスを取得したい変数名の文字列を渡して、変数のアドレスを取得したいです。

よろしくお願いします。

Aベストアンサー

無理です。

C/C++ はコンパイルした時点で変数名は捨てられて自動採番の識別子に置き換えられるので。

ただし、「どうしても変数名から」というときのために「マクロ引数の文字列化」を巧みに利用してそれらしい挙動をさせるためのコードはよく見ます。
詳しくはググってください。

参考になればよろしいんですが。

QC言語C++言語アセンブラ言語の就職先

自分は以前Javaプログラマをやってました。

あまりに、便利なライブラリばかりで、「なんかプログラムを書いているというより、ソフトウェアの振る舞いを書いているだけだ。。」とおもってしまい、すきになれませんでした。正直、苦痛でした。

今、上記言語を勉強しているのですが、コンピュータの根本からプログラムをしている実感が沸き、とても面白いです。

でも、これらの言語を習得したところでどんなところに就職できるのかさっぱりわかりませんし、需要があるのかもしりません。いわゆる組み込み系統は就職できるんでしょうが、私としてはアルゴリズムでUNIXのプログラムをシコシコ書いているような作業がすきなのです。いってみれば、私はクラシックな人間だとおもいます。

そんな僕ですが、就職先はあるのでしょうか?よろしくお願いします。

Aベストアンサー

 勉強熱心ですね。
 実際に、kamkamkam3-san の言われている、
「なんかプログラムを書いているというより、ソフトウェアの振る舞いを書いているだけだ。。」というのは的を得ています。
 
 経験からなんですが、ソフトウェア会社では、ノウハウとしてライブラリをもっています。ちょうど、Java のクラス・ライブラリーなようなものです。ですから、それらを使って製品を効率良く製品をつくれるかが重要です。実際のソフトウェア・エンジニアは、それをうまく使って効率良くコーディングすることを要求されます。

 ソフトウェア業界は、1人で閉じた製品を開発することは、まずないです。製品=プロジェクトだとすると、最低3名~100人以上が同時進行となります。そうなると、割り当てられたノルマを効率良く行うかが評価のポイントになります。つまり、「ソフトウェアの振る舞いを書いているだけ」ということにもなります。

 コンピュータ言語は、あくまでもツール(道具)です。
 kamkamkam3-san が、今後どういった分野の仕事を希望している(興味がある)かが重要だと思います。
 その答えとして、「C言語C++言語アセンブラ言語」を勉強することで実感できると思います。ですので、ぜひ、勉強を続けてください。

 勉強熱心ですね。
 実際に、kamkamkam3-san の言われている、
「なんかプログラムを書いているというより、ソフトウェアの振る舞いを書いているだけだ。。」というのは的を得ています。
 
 経験からなんですが、ソフトウェア会社では、ノウハウとしてライブラリをもっています。ちょうど、Java のクラス・ライブラリーなようなものです。ですから、それらを使って製品を効率良く製品をつくれるかが重要です。実際のソフトウェア・エンジニアは、それをうまく使って効率良くコーディングすることを要求さ...続きを読む


人気Q&Aランキング

おすすめ情報