I/O重定向
标准I/O
程序对读入的数据进行处理,再输出数据。数据的输入(input)和输出(output)简称为I/O,在没有指定输入输出的情况下,默认为标准输入和标准输出。
打开的文件都有一个文件描述符(fd, file descriptor),表现为一个数字:
- 标准输入stdin(键盘):fd = 0
- 标准输出stdout(显示器):fd = 1
- 标准错误输出stderr(显示器):fd = 2
标准I/O
#include <stdio.h>
int main(int argc, char *argv[]) {
int num;
printf("(stdin) Enter an integer: ");
fflush(stdout);
if (fscanf(stdin, "%d", &num) != 1) {
fprintf(stderr, "Invalid input.\n");
return 1;
}
fprintf(stdout, "(stdout) num = %d\n", num);
fprintf(stderr, "(stderr) This is an error message.\n");
return 0;
}运行结果
(stdin) Enter an integer: 123
(stdout) num = 123
(stderr) This is an error message.文件I/O
#include <stdio.h>
#include <stdlib.h>
void writeFile(const char *filename) {
FILE *fp = fopen(filename, "w");
if (!fp) {
fprintf(stderr, "File open failed.\n");
exit(1);
}
char *name = "Terry";
int age = 24;
double height = 179.8;
fprintf(fp, "Name: %s\nAge: %d\nHeight: %.2f\n",
name, age, height);
fclose(fp);
}
void readFile(const char *filename) {
FILE *fp = fopen(filename, "r");
if (!fp) {
fprintf(stderr, "File open failed.\n");
exit(1);
}
char name[32];
int age;
double height;
if (fscanf(fp, "Name: %31s\nAge: %d\nHeight: %lf",
name, &age, &height) != 3) {
fprintf(stderr, "Invalid file data.\n");
fclose(fp);
exit(1);
}
printf("name: %s\n", name);
printf("age: %d\n", age);
printf("height: %.2f\n", height);
fclose(fp);
}
int main(int argc, char *argv[]) {
const char *filename = "info.txt";
writeFile(filename);
readFile(filename);
return 0;
}运行结果
name: Terry
age: 24
height: 179.80I/O重定向(I/O Redirection)
I/O重定向就是改变标准输入与输出的默认位置。标准输入默认是键盘,通过改成其它输入,就是输入重定向,例如从文本文件里输入。标准输出默认是显示器,通过改成其它输出,就是输出重定向,例如输出到文件。
输出重定向用>表示,若文件不存在,则创建;若文件已存在,则覆盖。使用>>时若文件不存在,则创建,若文件已存在,则追加。错误输出重定向用2>和2>>表示。
输入重定向用<表示,但是在输入重定向中<<可不是表示输入追加。
I/O重定向
#include <stdio.h>
int main(int argc, char *argv[]) {
int data;
if (scanf("%d", &data) != 1) {
fprintf(stderr, "Invalid input.\n");
return 1;
}
printf("data = %d\n", data);
return 0;
}input.txt
12345编译
gcc -Wall io_redirection.c -o io_redirection运行
./io_redirection < input.txt > output.txt运行结果:output.txt
data = 12345互动实验
连接三条I/O数据流
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
标准错误输出stderr对应哪个文件描述符?
知识测验
题目
保留已有日志,并把本次stderr追加到error.txt,应该使用哪个操作符?
动手练习
把输入、结果和错误分开
使用input.txt、output.txt和error.txt完成一次I/O重定向。
- 编译io_redirection.c,令input.txt包含12345。
- 从文件读取输入,将stdout覆盖写入output.txt,把stderr追加到error.txt。
- 检查output.txt的内容。用Lab比较再次运行时>与>>的差别。