当我们提到输入时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。
当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C 语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。
- 1.标准文件
C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。
以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。
标准文件 | 文件指针 | 设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 屏幕 |
标准错误 | stderr | 您的屏幕 |
C 语言中的 I/O (输入/输出) 通常使用 printf() 和 scanf() 两个函数。
scanf() 函数用于从标准输入(键盘)读取并格式化
printf() 函数发送格式化输出到标准输出(屏幕)。
- printf() 函数
printf() 函数用于将格式化的数据输出到标准输出设备(通常是屏幕)。
#include <stdio.h> // 执行 printf() 函数需要该库
int main()
{printf("菜鸟教程"); //显示引号中的内容return 0;
}
- scanf() 函数
scanf() 函数用于从标准输入设备(通常是键盘)读取格式化的输入。
#include <stdio.h>int main() {int a;float b;printf("Enter an integer and a float: ");scanf("%d %f", &a, &b);printf("You entered: %d and %.2f\n", a, b);return 0;
}
- 单个字符输入输出
- getchar()
int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。
- putchar() 函数
int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。
#include <stdio.h>int main()
{int c;printf("Enter a value:");c = getchar(); //获取单个字符printf("\nYou entered: ");putchar(c); //输出单个字符return 0;
}
-
字符串输入输出
- gets()和fgets():
gets() 函数用于从标准输入设备读取一行字符串,但不推荐使用,因为它容易导致缓冲区溢出,推荐使用 fgets() 函数。
char *fgets(char *str, int n, FILE *stream);
- str:指向字符数组的指针,用于存储读取的字符串。
- n:要读取的最大字符数(包括空字符\0)。
- stream:文件流,通常使用stdin表示标准输入。
#include <stdio.h>int main() {char str[100];printf("Enter a string: ");fgets(str, sizeof(str), stdin);printf("You entered: %s", str);return 0; }
- puts() 函数
puts() 函数用于将一个字符串输出到标准输出设备,并自动在末尾添加换行符。
语法:int puts(const char *str);
- str:要输出的字符串。
- 成功时返回非负值,失败时返回EOF。
#include <stdio.h>int main() {char str[] = "Hello, World!";puts(str);return 0; }
- fputs() 函数
fputs() 函数用于将字符串输出到指定的流(如标准输出、文件等),但不会自动在字符串末尾添加换行符。
int fputs(const char *str, FILE *stream);
- str:要输出的字符串(以空字符 \0 结尾的字符数组)。
- stream:指定输出的流,可以是标准输出(stdout)、文件流等。
- 成功时返回一个非负值(通常是输出的字符数)。
- 失败时返回 EOF。
-
特点:
不添加换行符:fputs() 不会在输出字符串后自动添加换行符。
灵活的输出流:fputs() 可以输出到任意流,如标准输出、文件等。
#include <stdio.h>int main() {char str[] = "Hello, World!";fputs(str, stdout); // 输出 "Hello, World!",不换行return 0;
}
- puts() 和 fputs() 的区别
特性 | puts() | fputs() |
---|---|---|
换行符 | 自动在字符串末尾添加换行符 | 不添加换行符 |
输出流 | 只能输出到标准输出(屏幕) | 可以输出到任意流(如文件、屏幕) |
参数 | 只需要一个字符串参数 | 需要字符串参数和流参数 |
返回值 | 成功时返回非负值,失败时返回 EOF | 成功时返回非负值,失败时返回 EOF |
- 文件输入与输出
C 语言还提供了文件输入输出的功能,允许从文件中读取数据或向文件中写入数据
- fopen()函数
用于打开一个文件
FILE *fopen(const char *filename, const char *mode);
-
参数:
- filename:要打开的文件名。
- mode:打开文件的模式,如"r"(只读)、"w"(只写)、"a"(追加)等。
-
返回值:
- 成功时返回指向FILE对象的指针,失败时返回NULL。
-
fclose() 函数
用于关闭一个打开的文件
int fclose(FILE *stream);
-
参数:
- stream:指向FILE对象的指针。
-
返回值:
- 成功时返回0,失败时返回EOF。
+ fprintf(文件名, "Hello, world!\n"); // 写入文件
+ fscanf(文件名, "%s", buffer); //读取数据赋值给buffer、fscanf的%s只会读取第一个单词#include <stdio.h>int main()
{FILE *file; // 是一个文件指针的声明语句file = fopen("example.txt", "w"); //可写模式打开文件if(file != NULL){fprintf(file, "Hello World!\n"); //写入文件fclose(file); //关闭文件}char buffer[100];file = fopen("example.txt", "r"); // 打开文件用于读取if(file != NULL){fscanf(file, "%s", buffer); //读取数据printf("Read form file: %s\n", buffer);fclose(file);}return 0;
}
- 问题1:读取不完整
现象:fscanf的%s只会读取第一个单词
改进:使用fgets读取整行
fgets(buffer, sizeof(buffer), file);
- 问题2:缓冲区溢出风险
现象:文件内容超过99字符(需留1字节给\0)会导致溢出
改进:限制读取长度
fscanf(file, "%99s", buffer); // 最多读取99字符
- 代码改进
#include <stdio.h>
#include <string.h>int main() {FILE *file; // 是一个文件指针的声明语句// 写入文件(修正拼写错误)file = fopen("example.txt", "w");if(file != NULL) {fprintf(file, "Hello World!\n");fclose(file);}// 读取文件(安全方式)char buffer[100];file = fopen("example.txt", "r");if(file != NULL) {fgets(buffer, sizeof(buffer), file); // 读取整行buffer[strcspn(buffer, "\n")] = '\0'; // 去除换行符printf("Read from file: %s\n", buffer);fclose(file);} else {printf("Failed to open file!\n");}return 0;
}
-
关键知识点总结
-
文件打开模式:
- "w":写入(覆盖)
- "a":追加
- "r":读取
- "w+":读写(覆盖)
-
文件操作三步骤:
FILE *f = fopen(); // 1. 打开
/* 操作文件 */ // 2. 读写
fclose(f); // 3. 关闭
- 常用函数对比:
函数 | 用途 | 特点 |
---|---|---|
fprintf | 格式化写入文件 | 类似printf |
fscanf | 格式化读取 | 容易溢出,需限制长度 |
fgets | 安全读取一行 | 推荐使用 |
fputs | 写入字符串 | 不自动添加换行符 |