以下のような、テキストファイルを用意しました。

factor EF-G
2117..3334 +40515605614tufA1aq_005JCOG0050

elongation factor EF-Tu
3346..3660 +10415605615rpsJaq_008JCOG0051ribosomal
・・・・というふうにこういうのが延々と続くわけですが、ここから、
2117と3334、3346と3660というふうにここの数字だけを抜きたいんです。
たとえば、fgetcで、1行よんでから、一文字ずつ読んで、何個めから・・みたいに書いていったんですが、どうしてもうまくうごいてくれません。
なにか、ほかにいいアイデアないでしょうか?

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

A 回答 (4件)

前提条件として、


1.行の終わりは改行がある
2.抜き出したい数字が含まれる行以外は数字で始まらない
3.抜き出したい数字部分の桁数は固定である
というのが成立するのであれば、
1.fgets()で一行読み込み
2.1文字目(C言語的に言うと0文字目?)が数字か否か?
3.1文字目が数字ならば、1文字目から4文字目までと、7文字目から10文字目を取り出して保存
っていうので、かなりお手軽なプログラムが出来ると思うのですが。
そうでなくても、だいたい似たような処理で出来ると思います。

見たところ、理系の実験データのようですね。
ちょっと、辛口ですが、理系の人なら、発想の転換もお手の物では?
ちょっと目先を変えればすぐ解決しそうなものですが・・・
それとも、自分みたいな工学系の人間とは発想が違うのかな・・・

ちなみに、これがベストというわけではないので、さらに色々工夫してみると
もっとすっきりするかも知れませんね。研究あるのみです。
    • good
    • 0

昔の記憶ですみません。

unix 系では字句解析を行うルーチンを自動的に生成
する lex/flex というツールがあります。
数字だけで構成されるトークンを切り出すようなものは lex / flex を使えば
簡単に作ることができた思います。
Windows 系の OS にも移植されていたはずです。
    • good
    • 0

数字が記述された行を特定することはできるのですよね。


ならば、次のようにしてみて下さい。

・行の読み込み
  fgets(buf, DATA_LEN, fp);
・数値の抜き出し
  sscanf(buf, "%d%*c%*c%d", &a, &b);

「%*c」というのは、「そこにある1文字は読み捨てろ」という意味です。
つまり、数値と数値の間にあるピリオド2つを無視して、数値のみを抜き出します。
    • good
    • 0

以下の条件が必須になります。



1.抜き出す文字列の前の行には、「factor EF-」が必ずある。
2.抜き出す文字は行の先頭からで、最初の区切りに「..」、次の区切りにスペースがある。

この条件から、以下のような処理が考えられます。(エラー処理は考慮していません。)
1.ターゲットファイルをオープンする。
2.一行読込む。但し、EOFだったら項目8へ。
3.「factor EF-」が含まれるか確認し、なければ、項目2.へ戻る。
4.一行読込む。但し、EOFだったら項目8へ。
5.「..」の位置を検出し、先頭からその位置までを前半データ保存用領域へコピーする。
6.項目5.の処理で取得した位置からさらにスペースの位置を検出し、項目5.の検出位置+2(「..」の分)から、検出位置までを後半データ保存領域へコピーする。
7.項目2.へ戻る。
8.ファイルをクローズして終了。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

Qpthread_cond_waitとptherad_cond_signal

pthread_cond_waitで寝ているthreadに対して、ptherad_cond_signalにて起こして、そのthreadが再度寝るまでの間にpthread_cond_signalが複数回(2回として)Callされた場合、どのような挙動になるのでしょうか?

最初のSignalをA、以下B,Cとすると
A->cond_wait->B->cond_wait->C
となるのでしょうか?

宜しくお願い致します。

Aベストアンサー

>waitしていたthreadが稼動している状態でのsignal発行は空振りに終わるということでしょうか?
その通りです。
ptherad_cond_signalが発行されたとき、pthread_cond_waitで待機しているスレッドがなければ、そのシグナルは無視されます。
参考までに下記の実験結果を参照下さい。(空白は全角にしてます)
ソースプログラム
-------------------------------------------
#include  <stdio.h>
#include  <stdlib.h>
#include  <pthread.h>
#include  <time.h>
pthread_mutex_t mut_sub_print = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mut_sub_th = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_sub_th = PTHREAD_COND_INITIALIZER;
int main_sleep_time;
int sub_sleep_time;

void  sub_print(char *name,char *msg,int ctr)
{
  pthread_mutex_lock(&mut_sub_print);
  printf("%s:%s(%d)\n",name,msg,ctr);
  fflush(stdout);
  pthread_mutex_unlock(&mut_sub_print);
}
void  *sub_thread(void *adddr)
{
  int   ctr = 0;
  pthread_mutex_lock(&mut_sub_th);
  while(1){
    pthread_cond_wait(&cond_sub_th,&mut_sub_th);
    ctr++;
    sub_print("sub","con_wait終了",ctr);
    usleep(sub_sleep_time*1000);
  }
  return NULL;
}
// 第1パラメータにメインスレッドのスリープ時間(ミリ秒)
// 第2パラメータにサブスレッドのスリープ時間(ミリ秒)
int main(int argc,char **argv)
{
  int ret;
  int i;
  int ctr = 0;
  pthread_t  tid;
  if (argc != 3){
    printf("%s P1 P2\n",argv[0]);
    printf("P1:メインスレッドのスリープ時間(ミリ秒)\n");
    printf("P2:サブスレッドのスリープ時間(ミリ秒)\n");
    exit(1);
  }
  main_sleep_time = atoi(argv[1]);
  sub_sleep_time = atoi(argv[2]);
  printf("メインスリープ時間=%dミリ秒\n",main_sleep_time);
  printf("サブスリープ時間=%dミリ秒\n",sub_sleep_time);
  ret = pthread_create(&tid,NULL,sub_thread,NULL);
  if (ret != 0){
    printf("pthread_create error:%d\n",ret);
    exit(1);
  }
  usleep(1000);  //1ミリ停止
  for (i = 0; i < 10; i++){
    ctr++;
    pthread_cond_signal(&cond_sub_th);
    sub_print("main","cond_signal完了",ctr);
    usleep(main_sleep_time*1000);
  }
  sleep(10);
  sub_print("main","スレッド停止",0);
  exit(0);
}
---------------------------------------------
第一引数にメインスレッドのスリープ時間
第二引数にサブスレッドのスリープ時間を指定します。
メインスレッド側で、スリープ時間を大きくとり、ゆっくりと
cond_signalを発行すると、空振りが起こりにくくなります。
逆にメインスレッド側で、スリープ時間を小さく取り、
cond_signalを速射すると、空振りが起こりやすくなります。
以下、実行結果。
メインスレッド:300ミリのスリープ
サブスレッド:100ミリのスリープの場合
cond_signal 300 100
メインスリープ時間=300ミリ秒
サブスリープ時間=100ミリ秒
main:cond_signal完了(1)
sub:con_wait終了(1)
main:cond_signal完了(2)
sub:con_wait終了(2)
main:cond_signal完了(3)
sub:con_wait終了(3)
main:cond_signal完了(4)
sub:con_wait終了(4)
main:cond_signal完了(5)
sub:con_wait終了(5)
main:cond_signal完了(6)
sub:con_wait終了(6)
main:cond_signal完了(7)
sub:con_wait終了(7)
main:cond_signal完了(8)
sub:con_wait終了(8)
main:cond_signal完了(9)
sub:con_wait終了(9)
main:cond_signal完了(10)
sub:con_wait終了(10)
main:スレッド停止(0)

メインスレッド:100ミリのスリープ
サブスレッド:300ミリのスリープの場合
cond_signal 100 300
メインスリープ時間=100ミリ秒
サブスリープ時間=300ミリ秒
main:cond_signal完了(1)
sub:con_wait終了(1)
main:cond_signal完了(2)
main:cond_signal完了(3)
main:cond_signal完了(4)
sub:con_wait終了(2)
main:cond_signal完了(5)
main:cond_signal完了(6)
main:cond_signal完了(7)
sub:con_wait終了(3)
main:cond_signal完了(8)
main:cond_signal完了(9)
main:cond_signal完了(10)
sub:con_wait終了(4)
main:スレッド停止(0)

>waitしていたthreadが稼動している状態でのsignal発行は空振りに終わるということでしょうか?
その通りです。
ptherad_cond_signalが発行されたとき、pthread_cond_waitで待機しているスレッドがなければ、そのシグナルは無視されます。
参考までに下記の実験結果を参照下さい。(空白は全角にしてます)
ソースプログラム
-------------------------------------------
#include  <stdio.h>
#include  <stdlib.h>
#include  <pthread.h>
#include  <time.h>
pthread_mutex_t mut_sub_print =...続きを読む

Q_CRT_SECURE_NO_DEPRECATE が効かない?

お世話になっております。
現在、Windows XP、VC++2005 にてプログラム中なのですが、
「strcpy()」についてです。

本ライブラリはセキュリティ強化のため「strcpy_s()」の使用を
奨励されていますが、箇所が多いので取り合えずWarningだけでも
取りたいと思っています。

--
#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
charszBuf[10];
strcpy( szBuf, "test" );

return 0;
}
--

というサンプルコードに対して

warning C4996: 'strcpy' が古い形式として宣言されました。
'strcpy' の宣言を確認してください。
'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

と出たので、ファイルの先頭に

#define_CRT_SECURE_NO_DEPRECATE

と加えたのですがWarningが取れません。
同様に

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

としても駄目でした。

他に何か必要なことはあるのでしょうか?
#pragmaは出来るだけ避けたいのですが。

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

お世話になっております。
現在、Windows XP、VC++2005 にてプログラム中なのですが、
「strcpy()」についてです。

本ライブラリはセキュリティ強化のため「strcpy_s()」の使用を
奨励されていますが、箇所が多いので取り合えずWarningだけでも
取りたいと思っています。

--
#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
charszBuf[10];
strcpy( szBuf, "test" );

return 0;
}
--

というサンプルコードに対して

warnin...続きを読む

Aベストアンサー

stdafx.hがあるならstdafx.hに
#define _CRT_SECURE_NO_DEPRECATE
を記述されたら良いと思います

QAES暗号にて、AES_set_encrypt_keyで設定されるAES_KEYについて

VC++2008にてopensslを用いて、AES暗号/復号の機能を作成しています。

AES_set_encrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_ENCRYPT)にて暗号、
AES_set_decrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_DECRYPT)にて復号するコーディングをしました。

(http://d.hatena.ne.jp/hnko/20090302/1235977892のenc_aes128_cbc_test()を参考にしましたので、
一連の流れは、こことほぼ同じです)

デバッグしてみると、一見、暗復号が問題なく出来ていたので、
AES_set_encrypt_key関数の第一引数のkey配列の値と、
ivec配列の値を変えて、デバッグしてみたところ、
key配列を変更すると、暗号化後の文字列も変更されますが、
ivec配列を変更しても、暗号後の文字列に変化が有りませんでした。

調べてみたところ、AES_set_encrypt_keyにて返される
AES_KEYのroundsの値が常に同じであることが原因と思われますが、
roundsの値が常に一定だと、暗号解読が比較的容易に
出来てしまうと思うのですが、上記で挙げたサイトでの
コーディングの他に、何か別にコーディングを足さなければならないのでしょうか?

よろしくお願いします。

VC++2008にてopensslを用いて、AES暗号/復号の機能を作成しています。

AES_set_encrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_ENCRYPT)にて暗号、
AES_set_decrypt_key → ivをコピー → AES_cbc_encrypt(~,AES_DECRYPT)にて復号するコーディングをしました。

(http://d.hatena.ne.jp/hnko/20090302/1235977892のenc_aes128_cbc_test()を参考にしましたので、
一連の流れは、こことほぼ同じです)

デバッグしてみると、一見、暗復号が問題なく出来ていたので、
AES_set_encrypt_key関数の第一引...続きを読む

Aベストアンサー

>ivec配列を変更しても、暗号後の文字列に変化が有りませんでした。
初期ベクタを変えれば必ず暗号文が変化する筈。
変わらないとしたら、初期ベクタを変えているつもりで変わってないだけ。

因みに、初期ベクタは、1ブロック暗号化するたびに内容が更新されていくので、使い方を間違えないように。

>roundsの値が常に一定だと、暗号解読が比較的容易に
暗号鍵を変えればAES_KEYの内容も変化する筈。
変わらないとしたら、暗号鍵を変えているつもりで変わってないだけ。

Qfgetc関数について

C言語で、fgetc関数を使って1文字読み込んだ文字をarray[i]=cのようにすると
エラーが出るのですが、fgetcはint型を返すみたいのですが、それをうまく文字配列に入れるには、どうすればいいのですか?

Aベストアンサー

intからcharなら自動的に型変換してくれるはずだから、
そのまま代入できるはずです。

エラー・メッセージをcopy&pasteして、補足したほうが、回答が付きやすいかと。

Qfgetcの返却値 EOFについて

C言語について質問です。あまり詳しくないので言葉や、説明等間違っているところが
あり読みにくいと思います。

fgetc関数の返却値についてのお伺いします。
EOFはファイルの終わり又は、読み込みが失敗すると、返却されるとあります。
ここで、質問なのですが、2つの違いを判断することは可能でしょうか?

私が行った作業は
あるファイル内の文字を1文字づつ読み込んで。
文字の種類ごとに指定したbufferferに格納させたいと思っています。
しかし、ファイル内の終端がEOFで終る場合に読み込みエラーの場合と、読み込み終了で
場合分けができない為うまくできません。

#include<stdio.h>
#include<ctype.h>

char buffer[100];
char *filename="TestFile";

char* main(){

static FILE *fp = NULL;
char *p = buffer;
int c;
if ( fp == NULL ){
if ((fp = fopen( filename, "r" )) == NULL ){
fprintf(stderr,"can not open file %s\n", filename);
return ( (char *)NULL );
}
}

c = fgetc(fp);
while(1){
switch(c){

case '\n':
case '\0':
*p = '\0';
return( buffer);
/*以下のcase EOF の時に2通り考えられる*/
case EOF:/*読み込み終了*/
*p = '\0';
return( buffer);
/* case EOF:/*読み込みエラー
fprintf(stderr, " OPEN _ERROR %s\n", filename);
fclose(fp);
fp = NULL;
return ( (char *)NULL );
*/
default:
*p = (char)c;
p++;
}
c = fgetc(fp);
}
}


以上です。

このような場合どうしたらよいのでしょうか?また異なるやり方があればご教授お願いします。
よろしくお願いします。

C言語について質問です。あまり詳しくないので言葉や、説明等間違っているところが
あり読みにくいと思います。

fgetc関数の返却値についてのお伺いします。
EOFはファイルの終わり又は、読み込みが失敗すると、返却されるとあります。
ここで、質問なのですが、2つの違いを判断することは可能でしょうか?

私が行った作業は
あるファイル内の文字を1文字づつ読み込んで。
文字の種類ごとに指定したbufferferに格納させたいと思っています。
しかし、ファイル内の終端がEOFで終る場合に読み込みエ...続きを読む

Aベストアンサー

ferror関数でエラーが発生しているかどうかが判定できます。
feof関数でファイル終端かどうかが判定出来ます。
詳しくは、参考URLを見てください。

参考URL:http://ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken/miyakosi/c07.html


人気Q&Aランキング

おすすめ情報