使用argv读取文件

时间:2017-01-17 01:41:55

标签: c bash argv

目前,代码正在读取文件并对记录进行排序,如下所示

#include"fileIO/file.h"

#define MAX_RECORD_SIZE 256 // Bad style


typedef struct{
  int age;
  char *lastName;
  char *firstName;
}Person;

 .....



int main(int argc, char *argv[]){

  FILE *pFile = fopen("file.txt", "r");

  ....
  callInsertionSort(getItemList(cache), getSize(getItemList(cache)), less);

}

其中,file.txt

Age,LastName,FirstName
50,B,A
30,A,B
20,X,D
10,F,A
10,A,B
90,V,E
60,N,M
  

执行:

$./sort.exe
Before sorting
Age,LastName,FirstName
  50  B  A
  30  A  B
  20  X  D
  10  F  A
  10  A  B
  90  V  E
  60  N  M
After sorting

Age,LastName,FirstName
  10  F  A
  10  A  B
  20  X  D
  30  A  B
  50  B  A
  60  N  M
  90  V  E

问题:

不使用fopen(),有没有办法让shell将file.txt的内容作为命令行参数传递,文件中每行一个参数,(通过argv通过传递shell命令(sort.exe)参数)?

2 个答案:

答案 0 :(得分:4)

您可以将程序运行为:

IFS=$'\n'
./sort.exe $(cat file.txt)

该文件的每一行都将成为程序的参数(将IFS设置为newline可防止文件中的空格成为参数分隔符。)

然后程序可以遍历argvargv[0]除外,其中包含程序名称)以获取所有行进行排序。

请注意,参数的大小有限制,因此此方法的可伸缩性不高。通常首选从文件中读取。

仅供参考,$(cat file.txt)也可以写为$(< file.txt)

答案 1 :(得分:2)

如果目标是将文件的每一行作为单独的命令行参数传递给sort.exe程序,那么您将需要Bash(位于标签中)并且您可以使用:

IFS=$'\n'; sort.exe $(cat file)

要演示,请使用替代命令printf和此类数据文件,使用代表空白:

verbiage
spaced⧫out
⧫leading⧫and⧫trailing⧫
⧫⧫multiple⧫⧫spaces⧫⧫everywhere⧫⧫

运行命令会产生:

$ ( IFS=$'\n'; printf '[%s]\n' $(cat file) )
[verbiage]
[spaced out]
[ leading and trailing ]
[  multiple  spaces  everywhere  ]
$

这使用外部( … )在子shell中运行命令,这样我的交互式IFS就不会搞砸了。在其他一些情况下,它们是不必要的。

请注意,命令行参数(加上环境变量)的长度可以是上限 - 有时高达256 KiB,而且很少。这意味着您只能用足够小的文件来完成这项工作。在大多数情况下,您最好遵循Unix(POSIX)sort命令并直接从指定为sort命令的参数的文件名中读取数据。