C言語関係掲示板

過去ログ

No.1086 指定数値が入っている行をカットする

[戻る] [ホームページ]
No.14253

指定数値が入っている行をカットする
投稿者---zero(2004/05/26 10:37:40)


ファイルに以下のように数値がカンマごとに区切られてはいっているのですが、最後の数値が-3の行をカットして新規にファイルを作るプログラムを作りたいと思っています。
この場合の-3が入っているかの判定とその入っている行の削除の部分がわかりませんので、どなたか教えていただけないでしょうか? 

msst2003020312,138.400000,35.000000,-3.000000
msst2003020312,138.450000,35.000000,-3.000000
msst2003020312,138.500000,35.000000,16.800000
msst2003020312,138.550000,35.000000,16.800000
msst2003020312,138.600000,35.000000,16.800000
msst2003020312,138.650000,35.000000,16.800000


No.14254

Re:指定数値が入っている行をカットする
投稿者---tetrapod(2004/05/26 10:46:39)


grep -v -e -3.0
とか。



No.14255

Re:指定数値が入っている行をカットする
投稿者---おでん(2004/05/26 11:03:59)


>ファイルに以下のように数値がカンマごとに区切られてはいっているのですが、最後の数値が-3の行をカットして新規にファイルを作るプログラムを作りたいと思っています。
>この場合の-3が入っているかの判定とその入っている行の削除の部分がわかりませんので、どなたか教えていただけないでしょうか? 
>
>msst2003020312,138.400000,35.000000,-3.000000
>msst2003020312,138.450000,35.000000,-3.000000
>msst2003020312,138.500000,35.000000,16.800000
>msst2003020312,138.550000,35.000000,16.800000
>msst2003020312,138.600000,35.000000,16.800000
>msst2003020312,138.650000,35.000000,16.800000

1.入力用と出力用のファイルをオープンする
2.入力ファイルから1行読み込む
3.読めなかったら終了→7.
4.読み込んだ行に"-3.000000"があったら2.にもどる
5.出力用のファイルに読み込んだ行を書き出す
6.2.にもどる
7.入力用と出力用のファイルをクローズする
8.処理終了


というロジックの時に「4.の判定方法が分からない」ですか?

※ 数値が固定長の時

char buf[]にデータを読み込んだ有るとして・・・
strnは、バッファ(.e.g char str1[32] etc)

if( sscanf(buf,"%s,%s,%s,%s",str1,str2,str3,str4) == 4 ){
    if( strcmp(str4,"-3.000000") == 0 ){
        →2. ;
    }
}else{
    →エラー処理
}

※ 数値が可変長の時

char buf[]にデータを読み込んだ有るとして・・・
f1は、double

if( sscanf(buf,"%s,%s,%s,%lf",str1,str2,str3,&f1) == 4 ){
    if( f1 == -3.0 ){ ←あやしい・・・
    // 問題が無ければ、固定長での比較時にstrncmp(str4,"-3.",3) == 0 の方が確実
        →2. ;
    }
}else{
    →エラー処理
}

かな?





No.14304

Re:指定数値が入っている行をカットする
投稿者---かずま(2004/05/30 01:16:47)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char buf[1024], *p, *q;

    while (fgets(buf, sizeof buf, stdin)) {
        for (p = buf; q = strchr(p, ','); p = q + 1) ;
        if (atof(p) != -3) fputs(buf, stdout);
    }
    return 0;
}

誰も、ちゃんとした回答をつけないので、私が書いてみました。
参考になりますか?


> grep -v -e -3.0

これは、最後でないところに -3.0 があったらダメですね。


> if( sscanf(buf,"%s,%s,%s,%s",str1,str2,str3,str4) == 4 ){

最初の "%s" で行全体を読み込んでしまうので == 4 になることはないでしょう。