目前,代码正在读取文件并对记录进行排序,如下所示
#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
)参数)?
答案 0 :(得分:4)
您可以将程序运行为:
IFS=$'\n'
./sort.exe $(cat file.txt)
该文件的每一行都将成为程序的参数(将IFS
设置为newline可防止文件中的空格成为参数分隔符。)
然后程序可以遍历argv
(argv[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
命令的参数的文件名中读取数据。