-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

您的数据显然是面向行的;一次读/写一个字符是没有意义的。

使用fgets(). 检查线路,确定它是否是您要保留的线路。如果是这样,请使用fputs().

于 2012-12-20T11:40:32.177 回答
1

if (fs=NULL)分配NULLfs而不是比较它们。用于==测试是否相等,即if (fs==NULL)

这同样适用if (ch=EOF)于您的代码的后面部分。

请注意,启用警告的编译可能会在条件表达式中指出此分配。

这些更改将允许您复制源文件的全部内容。查看是否只想复制以空格/数字开头的行isspaceisdigitunwind 的使用建议fgets会使这变得更简单。

于 2012-12-20T11:24:07.570 回答
0

实际上,您的问题很简单:您只是没有使用正确的工具。事实上,在 bash 中(默认安装在大多数 Linux 发行版和 Mac OS X 上。对于 Windows,安装cygwinmingw),这就是工作:

tail -n +8 copying_columns.data

实际上,这从第 8 行开始打印文件,有效地跳过了您的标题。awk 提供了一个更通用的解决方案:

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

也就是说,如果我们遇到两行或多行包含---. 在 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

此版本具有重置输入文件之间的计数器的额外优势。

最后,这是我的两分钱:学习(至少:))其中一种工具:它们非常高效,尤其是对于数据操作

于 2012-12-27T17:26:33.457 回答