我正在尝试使用命令行参数并在C中解析文本文件。基本上我希望能够输入两个数字,例如1和4,并让它读取文本文件的列然后打印它到stdout。我希望能够做到这样的事情:
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 4 < data.txt
PID CMD
449 bash
1129 -bash
25605 vi
6132 -bash
6208 vi
所以我需要输入要打印的列,将文件重定向到&#34; data.txt&#34;让它处理文件并打印出来。
到目前为止,我的代码是:
#include <stdio.h>
int main(int argc, char **argv){
//int row = argc[0];
//int col = argc[1];
//if number entered is less than one, re-enter
int i;
for (i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
if(argc < 1){
fprintf(stderr, "Enter a valid input");
//quit
return 1;
}
else{
char ch[256];
//ch[255] = '\0';
while(fgets(ch, 256, stdin) != NULL){
printf("%s", ch);
}
}
return 1;
}
但我不确定我是否在正确的轨道上,并对下一步该做什么感到困惑。我是C的新手,所以如果这是一个简单的问题我会道歉。
答案 0 :(得分:0)
为了帮助您入门,这改进了您收集命令行信息的方式。请注意,第一个参数argv[0]
是可执行文件本身的名称。请记住上面的评论,我没有进一步改进。语法为progname filename col1 col2
#include <stdio.h>
#include <stdlib.h>
void fatal(char *msg) {
printf("%s\n", msg);
exit (1);
}
int main(int argc, char*argv[])
{
int col1, col2;
FILE *fp;
char ch[256];
if(argc < 4)
fatal("Need three arguments");
if (sscanf(argv[2], "%d", &col1) != 1)
fatal("Argument 1 error");
if (sscanf(argv[3], "%d", &col2) != 1)
fatal("Argument 2 error");
printf("Read columns %d and %d from file %s\n", col1, col2, argv[1]);
if ((fp = fopen(argv[1], "r")) == NULL)
fatal("Unable to open file");
// process the file
while (fgets(ch, 256, fp) != NULL) {
printf("%s", ch);
}
fclose(fp);
return 0;
}
答案 1 :(得分:0)
这是我到目前为止所拥有的。我可以把它拆开然后我可以把它放回去,但是对于我的生活,我无法弄清楚如何告诉它只打印第一列。如果我可以有一些方向,那么我可以弄清楚如何做其余的,但我可以找到任何东西。这是我到目前为止的代码:
#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 *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;
token = strtok(NULL, " ");
}
}
return 0;
}
}