【发布时间】:2015-02-14 19:02:30
【问题描述】:
我正在尝试使用命令行参数并在 C 中解析文本文件。基本上我希望能够输入两个数字,例如 1 和 4,并让它读取文本文件的一列然后打印它到标准输出。我希望能够做这样的事情:
PID TTY TIME CMD
449 ttys000 0:00.35 -bash
1129 ttys001 0:00.35 -bash
25605 ttys001 0:00.15 vi prog.c
6132 ttys002 0:00.11 -bash
6208 ttys002 0:00.03 vi test
然后做:
./your_prog 1 2 5 < data.txt
PID TTY
449 ttys000
1129 ttys001
25605 ttys001 prog.c
6132 ttys002
6208 ttys002 test
我已经让程序能够根据命令行参数打印出正确的列。但是,我真正的问题是,如果给我一个包含未知数量的列的文本文件并被要求对其进行处理,我将如何使它适用于大多数(如果不是所有)这种格式的文本文件?
这是我目前的代码:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv){
int col1, col2;
int size = 512;
char ch[size];
char *temp[size];
char *my_array[size];
int field_count = 0;
char *token;
if(argc == 1){
fprintf(stderr, "I need more!\n");
return 1;
}
else{
//test to see what is stored
int i;
for (i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
if(sscanf(argv[1], "%d", &col1) != 1) return 1;
if(sscanf(argv[2], "%d", &col2) != 1) return 1;
while(fgets(ch, size, stdin) != NULL){
//get 1st token
token = strtok(ch, " ");
while(token != NULL){
//printf(" %s", token);
temp[i++] = token;
my_array[field_count] = token;
field_count++;
token = strtok(NULL, " ");
}
if(col1 == 1){
printf("%s\n", my_array[0]);
}
}
return 0;
}
}
【问题讨论】:
-
这已经用cut linux.die.net/man/1/cut完成了
-
仅供参考,您尝试做的正是
cut所做的。见linux.die.net/man/1/cut。 -
这是昨天的问题 (stackoverflow.com/questions/28505929/…),我建议您计算每一行的字段并保留与所需列号匹配的字段。然而,您并没有在每个文本行的开头重置
field_count。你快到了……但如果你不知道文件包含什么,你怎么知道要捕获哪些列?也许命令行参数应该指定列标题文本,然后解析第一行以确定您希望在后续行中保留哪些列numbers。 -
变量'size'应该是#define size (512)
-
顺便说一句,请注意您的第一个测试
if(argc == 1)。你想要两个列号,所以测试应该是if(argc != 3)
标签: c performance tokenize