3 Creating small tools 创建小工具
这一章的内容主要是关于文件的输入与输出的问题.
也就是说:怎么能够将文件作为程序的输入,以及如何将文件作为程序的输出.
用一句话总结,就是:
Make program work with files.
定义Standard Input & Standard Output
在程序执行开始后, Standard Input 和 Standard Output 被 O/S 创建.在默认情况下:
- Standard Input 接受键盘的输入;
- Standard Output 向显示屏输出.
当想要用文件作为输入、输出时,可以采用下面的方法.
——
Redirection (在命令行中使用 “>", "<"
输入格式:./cprogram <gpsdata.csv
作用: 将 gpsdata.csv 的数据作为名为 cprogram 的程序
输出格式:./cprogram > gpsdata.csv
作用: 将 gpsdata.csv 的数据作为名为 cprogram 的程序
Standard Error 以及 fprintf()
O/S 的进程不仅仅有 Standard Input 和 Standard Output,还有 Standard Error,可以利用其将错误提示与输出数据分割开来:
格式:
程序中: fprintf(stderr, "...");
命令行中: 2> error.txt (作用是将错误信息输出到 error.txt 文件中,文件名可以自定义)
fprintf() 是比 printf () 的更通用的函数,
其比 printf() 多一个参数,即第一项,
其 value 可以是 stdout(这就相当于 printf())
也可以是 stderr
fscanf 是比 scanf() 更通用的函数, fscanf(stdin, "...") 就相当于是 scanf()
管道连接符Pipe——“|”
Pipe 是将两个程序的输出和输入连接起来的符号,在命令行中使用.
其能将第一个程序的输出作为第二个程序的输入.
格式:
(./bermuda | ./geo2json) output.json
作用解释:
- 执行./bermuda 和 ./geo2json 两个程序
- ./bermuda 的输出是 ./geo2json 的输入
- spooky.csv 为第一个程序的输入
- output.json 为第二个程序的输出
注意: () 不能省略
自定义数据流Your own Data Streams
需要用到两个函数:fopen() 和 fclose()
对于需要读(输入)的文件,格式为:FILE *in_file = fopen("input.txt", "r");
(其中, "r" 代表read)
然后,程序应该用 fscanf 与程序语句配合,在 fscanf() 的第一个参数应该为文件的指针名.
fscanf(in_file, "...")
对于需要写(输出)的文件,格式为FILE *out_file = fopen("output.txt", "w");
(其中,“w"代表write)
然后,应该使用 fprintf() 函数输出,第一个参数为输出的文件的指针名.
自定义输出输入的文件名
在一般的程序中,无法自定义输出输入的文件名.
但是通过下面两种方法,可以自定义输入与输出的文件名.
1⃣️main() 利用 command-line arguments
格式:
int main(int argc, char *argv[])
main() 函数将 command-line arguments 看作 an array of strings.
其本身具有一些参数,其代表的意义如下:
int argc: 是 arg (参数)的数量
char *argv[] 是 arg (参数)的值
例如:
执行程序 ./categorize 的时候,在命令行中输入:./categorize mermaid mermaid.csv Elvis elvises.csv
其中, “./categorize”就是 argv[0], mermaid.csv是 argv[2].
2⃣️getopt() 利用 command-line options
option 是 形如“-a" 格式的命令
格式:
ch = getopt(argc, argv, "d:t")
然后用 switch 以 ch 为参数执行命令.
其中第三个参数为可用的 option
有冒号表示需要添加描述,其值存在 optarg 这个变量中(系统的变量)