1.思维导图
2.练习
1:使用C语言编写一个简易的界面,界面如下
1:标准输出流
2:标准错误流
3:文件流
要求:按1的时候,通过printf输出数据,按2的时候,通过perror输出数据,按3的时候将输入写入文件中
同时通过dup2函数,将标准错误流重定向到错误日志,将文件流重定向到终端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
void standard_output() {
printf("标准输出.\n");
}
void standard_error() {
perror("标准错误.");
}
void file_stream(const char *filename) {
char buffer[256];
printf("输入文本:\n ");
fgets(buffer, sizeof(buffer), stdin);
FILE *file = fopen(filename, "a");
if (file == NULL) {
perror("打开失败");
return;
}
fprintf(file, "%s", buffer);
fclose(file);
printf("写入成功\n");
}
int main() {
int choice;
char *error_log = "error.log";
// 标准错误定向
int error_fd = open(error_log, O_WRONLY | O_CREAT | O_APPEND, 0644);
if (error_fd == -1) {
perror("打开失败error.log");
return EXIT_FAILURE;
}
dup2(error_fd, STDERR_FILENO);
// 文件流定向终端
int term_fd = dup(STDOUT_FILENO);
while (1) {
printf("\nMenu:\n");
printf("1: 标准输出流\n");
printf("2: 标准错误流\n");
printf("3: 文件流\n");
printf("4: 退出\n");
printf("输入选项: ");
if (scanf("%d", &choice) != 1) {
fprintf(stderr, "无效,重新输入 :\n");
while (getchar() != '\n'); // Clear input buffer
continue;
}
getchar(); // Consume newline
switch (choice) {
case 1: //标准输出流
standard_output();
break;
case 2: //标准错误流
standard_error();
break;
case 3: //文件流
dup2(term_fd, STDOUT_FILENO);
file_stream("output.txt");
break;
case 4:
close(error_fd);
printf("退出.\n");
return EXIT_SUCCESS;
default:
fprintf(stderr, "无效,重新输入:\n");
break;
}
}
return 0;
}
2:使用stat函数判断一个文件是否存在 同组人可执行 权限,如果存在则去除该权限,如果不存在则追加该权限