如何使程序在C中的不同文本文件上工作

时间:2015-02-14 19:02:30

标签: c performance tokenize

我正在尝试使用命令行参数并在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 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;   
}
}

1 个答案:

答案 0 :(得分:0)

我注意到你试图通过将从strtok()返回的指针存储在一个数组中来捕获该字段,但该指针的数据是瞬态的:你需要有一个字符串数组来复制实际的文字进入。我已经重新设计并简化了你已经完成的尝试,请尝试这个只打印捕获的字段 - 下一步可能是将它们写入文件。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUF_SIZE    512                     // for buffer size

void fatal(char *msg) {                     // easy  & informative getout
    printf("%s\n", msg);
    exit (1);
}

int main(int argc, char **argv){
    int col1, col2;
    char ch[BUF_SIZE];
    int field_count;
    char delims[] = " \t\n";                // might be tabs and newlines
    char *token;

    if(argc != 3)                           // check exact number of args
        fatal ("I need more!");
    if(sscanf(argv[1], "%d", &col1) != 1)
        fatal ("Bad first argument");
    if(sscanf(argv[2], "%d", &col2) != 1)
        fatal ("Bad second argument");
    printf("Capturing fields %d and %d\n", col1, col2);

    while(fgets(ch, BUF_SIZE, stdin) != NULL){
        field_count = 1;                    // reset field count
        printf("Fields captured:");
        token = strtok(ch, delims);
        while(token != NULL){
            if (field_count == col1 || field_count == col2)
                printf(" %s", token);
            field_count++;
            token = strtok(NULL, delims);
        }
        printf("\n");
    } 
    return 0;   
}