-1

次のようなテキストファイルがあります:

Flooding refers to all water that overflows a node, whether it ponds or not.
  --------------------------------------------------------------------------
                                                             Total   Maximum
                                 Maximum   Time of Max       Flood    Ponded
                        Hours       Rate    Occurrence      Volume     Depth
  Node                 Flooded       CMS   days hr:min    10^6 ltr    Meters
  --------------------------------------------------------------------------
   1064                  0.15     0.000      0  00 00       0.000      0.35
   1065                  0.25     0.078      0  00 09       0.049      0.41
   1130                  0.25     0.626      0  00 00       0.106      0.90
   1155                  0.24     0.098      0  00 07       0.073      0.61
   1173                  0.25     0.106      0  00 15       0.022      0.76

結果のファイルが次のようになるように、数値列(テキストなし)をコピーしたい:

   1064                  0.15     0.000      0  00 00       0.000      0.35
   1065                  0.25     0.078      0  00 09       0.049      0.41
   1130                  0.25     0.626      0  00 00       0.106      0.90
   1155                  0.24     0.098      0  00 07       0.073      0.61
   1173                  0.25     0.106      0  00 15       0.022      0.76

今まで、私はこのコードを C で行うことができました:

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

void main()
{
FILE *fs,*ft;
int ch;
int c;
fs=fopen("node.txt","r");
if (fs=NULL)
{
    puts("cannot open source file");
    exit(0);
}
ft=fopen("new_node.txt","w");
do
{
   ch=fgetc(fs);
   if (ch=EOF)
   break;
   else
   {
    if (ch>0)
    fputc(ch,ft);
   }
     ch++;
}
  while(1);
  fclose(fs);
  fclose(ft);
  return 0;
}

問題は、そこから何も出ていないことです。誰でもこの点で助けて、実用的なコードを提供できますか?

4

3 に答える 3

1

あなたのデータは明らかに行指向です。このデータを一度に 1 文字ずつ読み書きするのは意味がありません。

を使用して、適切なサイズのバッファー (おそらく 1024 バイト) に行全体を読み取りますfgets()。行を調べて、保持したい行であるかどうかを判断してください。その場合は、 を使用して ut を書き出しfputs()ます。

于 2012-12-20T11:40:32.177 に答える
1

if (fs=NULL)NULLそれらを比較するのfsではなく、に割り当てます。==代わりに等しいかどうかをテストするために使用します。if (fs==NULL)

同じことがコードの後半にも当てはまりif (ch=EOF)ます。

警告を有効にしてコンパイルすると、おそらく条件式でこの代入が指摘されることに注意してください。

これらの変更により、ソース ファイルの内容全体をコピーできます。スペース/数字で始まる行のみをコピーしたい場合はisspace、調べてください。isdigit使用の巻き戻しの提案はfgets、これをはるかに簡単にします。

于 2012-12-20T11:24:07.570 に答える
0

実際、問題は非常に簡単です。適切なツールを使用していないだけです。実際、bash (ほとんどの Linux ディストリビューションと Mac OS X にデフォルトでインストールされています。Windows の場合はcygwinまたはmingwをインストールします) では、次のようにします。

tail -n +8 copying_columns.data

実際、これにより、8行目からファイルの出力が開始され、ヘッダーが効果的にスキップされます。Awk は、より一般的なソリューションを提供します。

awk 'x >= 2 {print}; /---/ {++x}' copying_columns.data

つまり、 を含む行が 2 つ以上ある場合は、その行を出力し---ます。perl では、これにより以下が得られます。

perl -ne 'if ($x >= 2) {print $_;} if (/---/){++$x;}

または、perl スクリプトを独自のファイルに入れると、次のようになりますcopying_columns.perl

#!/usr/bin/perl
use strict;
use warnings;
my $x = 0;
while (<>){
    if ($x >= 2){
        print $_;
    } 
    if (/---/){
        ++$x;
    }
}

で実行

 perl copying_columns.perl copying_columns.data

おまけとして、ここに Python バージョンがあります。

#!/usr/bin/python
import sys
for f in [open(fname, 'rb') for fname in sys.argv[1:]] or [sys.stdin]:
    x = 0
    for line in f:
        if x >= 2:
            print(line.rstrip('\r\n'))
        if line.find('---') >= 0:
            x += 1
    f.close()

で実行

python copying_columns.py copying_columns.data

このバージョンには、入力ファイル間のカウンターをリセットするという特別な利点があります。

最後に、ここに私の 2 つのセントがあります: (少なくとも :)) これらのツールの 1 つを学びます: それらは、特にデータ操作に関して驚くほど効率的です。

于 2012-12-27T17:26:33.457 に答える