Head First C 第三章总结

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
作用解释:

  1. 执行./bermuda 和 ./geo2json 两个程序
  2. ./bermuda 的输出是 ./geo2json 的输入
  3. spooky.csv 为第一个程序的输入
  4. 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 这个变量中(系统的变量)

posted @ 2020-01-22 16:44  FBshark  阅读(158)  评论(0编辑  收藏  举报