我有两个文件,第一个看起来像这样
125 6.678
435 9.084
234 8.874等等,我的程序生成了大约2,048,000条条目。第二个文件是gnuplot生成的文件,看起来有点像:
65 321456 985
78 98374 834
54 8493 848以此类推,大约有2,048,000条条目。
现在,我需要做的是用gnuket3D绘制第一个文件的第二列和第二个文件的两个列。我认为第一个任务是将它们都放在同一个文件中,我只想编写一个简单的c++程序,它可以快速读取两个文件,并将相关的列放在一个文件中,但我不知道如何做到这一点。我知道如何复制文件的全部内容,并使用c程序将它们写入另一个文件--例如,要做到这一点,我有以下代码:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, const char * argv[])
{
FILE *avalanche_size_BM;
FILE *avalanche_size_BM_2000;
char ch;
avalanche_size_BM = fopen("/Users/maheensiddiqui/Documents/MSc_Proj/avalanche_size_BM.dat","r");
if (avalanche_size_BM == NULL)
{
printf("I couldn't open.\n");
exit(0);
}
avalanche_size_BM_2000 = fopen("/Users/maheensiddiqui/Desktop/avalanche_size_BM_2000.dat", "w");
if (avalanche_size_BM_2000 == NULL)
{
printf("I couldn't open.\n");
exit(0);
}
printf("\n success!!");
while((ch=getc(avalanche_size_BM))!=EOF)
putc(ch,avalanche_size_BM_2000);
fclose(avalanche_size_BM);
fclose(avalanche_size_BM_2000);
return(0);
}但是我该如何告诉它,仅仅读取第一个文件中的第二个列和第二个文件中的前两个列,然后将它们(而不是所有列)复制到第三个文件中,我可以用来绘制我的三维图。
任何帮助都将不胜感激!
谢谢
发布于 2013-08-01 01:47:14
非C型回答
这假设您只是想要结果,而不是真正担心如何在C中实现。
要使用简单的命令行工具生成文件,可以使用paste和awk获得结果:
paste读取多个文件并将所有行合并在一起,并由一个制表符字符分隔。
因此,如果您有两个文件,比如foo.txt和bar.txt,它们的内容如下:
foo.txt:
a1 b1 c1
a2 b2 c2bar.txt:
d1 e1 f1
d2 e2 f2paste foo.txt bar.txt输出:
a1 b1 c1 d1 e1 f1
a2 b2 c2 d2 e2 f2然后,您可以使用awk过滤出所需的列。
因此,例如,如果您想要列2、4和5 (b1、d1、e1),可以使用以下内容:
paste foo.txt bar.txt | awk '{ print $2 " " $4 " " $5 }'
我将假设这两个文件都有相同数量的条目,在OSX中从Finder ->实用程序启动命令shell
在shell提示符下,您可以这样做:
$ cd Desktop
$ paste avalanche_size_BM.dat avalanche_size_BM_2000.dat | \
awk '{ print $2 " " $4 " " $5 }' > avalanche_size_3d.dat这将在桌面子目录中从第一个文件的第2列和第二个文件的前两列创建一个名为avalanche_size_3d.dat的文件(当它们粘贴在一起时,它们最终位于第4和第5位置)。
C-回答
这在本质上就像编写一个小型粘贴实用程序一样。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp1 = fopen ("file1", "r");
FILE *fp2 = fopen("file2", "r");
FILE *out = fopen("fileout", "w");
while (!feof(fp1) && !feof(fp2)) {
char buf[256], col1[256], col2[256], col3[256];
if ( fgets(buf, sizeof(buf), fp1) == 0 )
break;
sscanf(buf, "%s %s", col2, col1); /* we only need col1, col2 is reused later */
if ( fgets(buf, sizeof(buf), fp2) == 0 )
break;
sscanf(buf, "%s %s", col2, col3);
fprintf(out, "%s %s %s\n", col1, col2, col3);
}
fclose(fp1);
fclose(fp2);
fclose(out);
}发布于 2013-08-01 01:41:42
在C中,最简单的方法是从两个文件中各读取一行,并将这两行作为一行打印到第三个文件中。一旦这样做,您就可以解析实际要打印的每一行中的哪些部分,但是将两个文件合并到一个文件中可能就足以让您使用gnuplot来绘制数据。
要读取一行输入,可以使用fgets()。您可以对每一行使用两个单独的缓冲区。从从第一个文件获得的第一行中,删除末尾的换行符,然后将其打印到新文件中。然后,从第二个文件中打印这一行。
char buf1[MAX_LINE];
char buf2[MAX_LINE];
FILE *infile1 = fopen(..., "r");
FILE *infile2 = fopen(..., "r");
FILE *outfile = fopen(..., "w");
while (fgets(buf1, sizeof(buf1), infile1) != 0
&& fgets(buf2, sizeof(buf2), infile2) != 0) {
strchr(buf1, '\n')[0] = '\0';
fprintf(outfile, "%s %s", buf1, buf2);
}
fclose(outfile);
fclose(infile1);
fclose(infile2);读取输入行后,可以使用sscanf()解析输入,以检索您感兴趣的行的输出部分:
int file1_column1;
double file1_column2;
sscanf(buf1, "%d %lf", &file1_column1, &file1_column2);
int file2_column1;
int file2_column2;
int file2_column3;
sscanf(buf2, "%d %d %d", &file2_column1, &file2_column2, &file2_column3);您可以使用fprintf()打印这些值。
fprintf(outfile, "%f %d %d\n", file1_column2, file2_column1, file2_column3);https://stackoverflow.com/questions/17983323
复制相似问题