命令行参数和C中的读取文件/打印文本

时间:2015-02-13 18:08:13

标签: c process command-line-arguments

我正在尝试使用命令行参数并在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的新手,所以如果这是一个简单的问题我会道歉。

2 个答案:

答案 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;   
  }
}