我有一个文本文件,如下所示:
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;
}
问题是没有任何东西出来。任何人都可以在这方面提供帮助,并提供有效的代码。
答案 0 :(得分:1)
if (fs=NULL)
将NULL
分配给fs
而非比较它们。使用==
来测试相等性,即if (fs==NULL)
这同样适用于您的代码中的if (ch=EOF)
。
请注意,启用警告的编译可能会在条件表达式中指出此赋值。
这些更改将允许您复制源文件的全部内容。如果您只想复制以空格/数字开头的行,请查看isspace
和isdigit
。放松使用fgets
的建议会使这更加简单。
答案 1 :(得分:1)
您的数据显然是面向行的;它使没有有意义地一次一个字符地读/写这个数据。
使用fgets()
将整行读入适当大小的缓冲区(可能为1024字节)。检查线,确定是否要保留。如果是这样,请使用fputs()
写下来。
答案 2 :(得分: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
即,如果我们遇到包含---
的两行或更多行,则打印该行。在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
此版本具有在输入文件之间重置计数器的额外优势。
最后,这是我的两分钱:学习(至少:))其中一个工具:它们非常有效,特别是data manipulation。