引言
在C语言编程中,标准输入输出库 <stdio.h>
是最常用和最基本的库之一。它提供了一组函数,用于处理输入和输出操作,包括读取和写入字符、字符串、格式化输出和文件操作等。理解和掌握 <stdio.h>
库的功能对于每一个C语言程序员来说都是至关重要的。本文将详细介绍 <stdio.h>
库的各个方面,包括其函数、用法以及在实际编程中的应用。
<stdio.h>
库的基本功能
<stdio.h>
库包含许多重要的函数,这些函数可以分为以下几类:
1. 标准输入输出函数
函数 | 描述 |
---|---|
printf | 向标准输出打印格式化字符串 |
scanf | 从标准输入读取格式化输入 |
putchar | 向标准输出写入一个字符 |
getchar | 从标准输入读取一个字符 |
puts | 向标准输出写入一个字符串并换行 |
gets | 从标准输入读取一行字符串 |
2. 文件操作函数
函数 | 描述 |
---|---|
fopen | 打开文件 |
fclose | 关闭文件 |
fread | 从文件读取数据 |
fwrite | 向文件写入数据 |
fscanf | 从文件读取格式化输入 |
fprintf | 向文件写入格式化输出 |
fgets | 从文件读取字符串 |
fputs | 向文件写入字符串 |
3. 格式化输入输出函数
函数 | 描述 |
---|---|
sprintf | 将格式化输出写入字符串 |
sscanf | 从字符串读取格式化输入 |
snprintf | 将格式化输出写入字符串,限定最大长度 |
4. 字符和字符串操作函数
函数 | 描述 |
---|---|
fgetc | 从文件读取一个字符 |
fputc | 向文件写入一个字符 |
ungetc | 将字符退回到输入流 |
gets_s | 安全读取字符串(C11标准引入) |
5. 错误处理函数
函数 | 描述 |
---|---|
perror | 打印错误信息 |
clearerr | 清除文件流的错误标志 |
feof | 检查文件流是否到达文件末尾 |
ferror | 检查文件流是否发生错误 |
我们将逐一介绍这些函数的详细内容及其使用方法。
1. 标准输入输出函数
标准输入输出函数主要用于从标准输入(通常是键盘)读取数据和向标准输出(通常是屏幕)写入数据。常用的标准输入输出函数有:
printf
:向标准输出打印格式化字符串。scanf
:从标准输入读取格式化输入。putchar
:向标准输出写入一个字符。getchar
:从标准输入读取一个字符。puts
:向标准输出写入一个字符串并换行。gets
:从标准输入读取一行字符串。
printf
函数
printf
函数是C语言中最常用的输出函数,用于格式化输出数据。其基本语法如下:
int printf(const char *format, ...);
format
:格式字符串,包含普通字符和格式说明符。...
:可变参数,用于指定要输出的值。
常用的格式说明符包括:
%d
:整数%f
:浮点数%s
:字符串%c
:字符
#include <stdio.h>
int main() {
int num = 10;
float pi = 3.14;
char ch = 'A';
char str[] = "Hello, World!";
printf("Integer: %d\n", num);
printf("Float: %.2f\n", pi);
printf("Character: %c\n", ch);
printf("String: %s\n", str);
return 0;
}
scanf
函数
scanf
函数用于从标准输入读取格式化数据。其基本语法如下:
int scanf(const char *format, ...);
format
:格式字符串,包含格式说明符。...
:指针参数,用于存储读取的值。
示例代码:
#include <stdio.h>
int main() {
int num;
float pi;
char ch;
char str[100];
printf("Enter an integer: ");
scanf("%d", &num);
printf("Enter a float: ");
scanf("%f", &pi);
printf("Enter a character: ");
scanf(" %c", &ch); // 注意:这里有一个空格,防止读取换行符
printf("Enter a string: ");
scanf("%s", str);
printf("You entered:\n");
printf("Integer: %d\n", num);
printf("Float: %.2f\n", pi);
printf("Character: %c\n", ch);
printf("String: %s\n", str);
return 0;
}
putchar
和 getchar
函数
putchar
函数用于向标准输出写入一个字符,其基本语法如下:
int putchar(int ch);
getchar
函数用于从标准输入读取一个字符,其基本语法如下:
int getchar(void);
int getchar(void);
示例代码:
#include <stdio.h>
int main() {
char ch;
printf("Enter a character: ");
ch = getchar();
printf("You entered: ");
putchar(ch);
putchar('\n');
return 0;
}
puts
和 gets
函数
puts
函数用于向标准输出写入一个字符串并换行,其基本语法如下:
int puts(const char *str);
gets
函数用于从标准输入读取一行字符串,其基本语法如下:
char *gets(char *str);
注意:gets
函数由于安全性问题(缓冲区溢出)在C11标准中已被弃用,推荐使用 fgets
代替。
示例代码:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
gets(str);
printf("You entered: ");
puts(str);
return 0;
}
2. 文件操作函数
<stdio.h>
库提供了一组函数,用于文件的打开、关闭、读取和写入操作。这些函数包括:
fopen
:打开文件fclose
:关闭文件fread
:读取文件fwrite
:写入文件fscanf
:从文件读取格式化输入fprintf
:向文件写入格式化输出fgets
:从文件读取字符串fputs
:向文件写入字符串
文件打开和关闭
fopen
函数用于打开文件,其基本语法如下:
FILE *fopen(const char *filename, const char *mode);
filename
:要打开的文件名mode
:文件打开模式,如"r"
(只读)、"w"
(写入)、"a"
(追加)等。
fclose
函数用于关闭文件,其基本语法如下:
int fclose(FILE *stream);
示例代码:
#include <stdio.h>
int main() {
FILE *file;
file = fopen("example.txt", "w");
if (file == NULL) {
printf("Error opening file!\n");
return 1;
}
fprintf(file, "Hello, World!\n");
fclose(file);
return 0;
}
文件读取和写入
fread
和 fwrite
函数用于读取和写入二进制文件,其基本语法如下:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
ptr
:数据缓冲区size
:每个数据项的大小count
:要读取或写入的数据项数目stream
:文件指针
示例代码:
#include <stdio.h>
int main() {
FILE *file;
int num = 12345;
file = fopen("example.bin", "wb");
if (file == NULL) {
printf("Error opening file!\n");
return 1;
}
fwrite(&num, sizeof(int), 1, file);
fclose(file);
return 0;
}
格式化文件输入输出
fscanf
和 fprintf
函数用于格式化文件输入输出,其基本语法与 scanf
和 printf
类似,但多了一个文件指针参数:
int fscanf(FILE *stream, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
示例代码:
#include <stdio.h>
int main() {
FILE *file;
int num;
file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file!\n");
return 1;
}
fscanf(file, "%d", &num);
printf("Read number: %d\n", num);
fclose(file);
return 0;
}
字符串文件操作
fgets
和 fputs
函数用于字符串文件操作,其基本语法如下:
char *fgets(char *str, int n, FILE *stream);
int fputs(const char *str, FILE *stream);
示例代码:
#include <stdio.h>
int main() {
FILE *file;
char str[100];
file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file!\n");
return 1;
}
fgets(str, 100, file);
printf("Read string: %s", str);
fclose(file);
return 0;
}
3. 格式化输入输出函数
除了前面提到的 printf
和 scanf
,<stdio.h>
库还提供了一组函数,用于格式化输入和输出。这些函数包括:
sprintf
:将格式化输出写入字符串sscanf
:从字符串读取格式化输入snprintf
:将格式化输出写入字符串,限定最大长度
sprintf
函数
sprintf
函数用于将格式化输出写入字符串,其基本语法如下:
int sprintf(char *str, const char *format, ...);
示例代码:
#include <stdio.h>
int main() {
char buffer[100];
int num = 12345;
sprintf(buffer, "Number: %d", num);
printf("%s\n", buffer);
return 0;
}
sscanf
函数
sscanf
函数用于从字符串读取格式化输入,其基本语法如下:
int sscanf(const char *str, const char *format, ...);
示例代码:
#include <stdio.h>
int main() {
char buffer[] = "12345";
int num;
sscanf(buffer, "%d", &num);
printf("Read number: %d\n", num);
return 0;
}
snprintf
函数
snprintf
函数与 sprintf
类似,但它允许指定写入字符串的最大长度,以防止缓冲区溢出。其基本语法如下:
int snprintf(char *str, size_t size, const char *format, ...);
示例代码:
#include <stdio.h>
int main() {
char buffer[10];
int num = 12345;
snprintf(buffer, sizeof(buffer), "Number: %d", num);
printf("%s\n", buffer);
return 0;
}
4. 字符和字符串操作函数
<stdio.h>
库还提供了一些用于字符和字符串操作的函数,如:
fgetc
:从文件读取一个字符fputc
:向文件写入一个字符ungetc
:将字符退回到输入流gets_s
:安全读取字符串(C11标准引入)
fgetc
和 fputc
函数
fgetc
函数用于从文件读取一个字符,其基本语法如下:
int fgetc(FILE *stream);
fputc
函数用于向文件写入一个字符,其基本语法如下:
int fputc(int ch, FILE *stream);
示例代码:
#include <stdio.h>
int main() {
FILE *file;
char ch;
file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file!\n");
return 1;
}
while ((ch = fgetc(file)) != EOF) {
putchar(ch);
}
fclose(file);
return 0;
}
ungetc
函数
ungetc
函数用于将一个字符退回到输入流,其基本语法如下:
int ungetc(int ch, FILE *stream);
示例代码:
#include <stdio.h>
int main() {
FILE *file;
char ch;
file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file!\n");
return 1;
}
ch = fgetc(file);
printf("Read character: %c\n", ch);
ungetc(ch, file);
ch = fgetc(file);
printf("Read character again: %c\n", ch);
fclose(file);
return 0;
}
gets_s
函数
gets_s
函数是C11标准中引入的安全字符串读取函数,用于防止缓冲区溢出。其基本语法如下:
char *gets_s(char *str, rsize_t n);
示例代码:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
gets_s(str, sizeof(str));
printf("You entered: %s\n", str);
return 0;
}
5. 错误处理函数
<stdio.h>
库提供了一些用于错误处理的函数和宏,包括:
perror
:打印错误信息clearerr
:清除文件流的错误标志feof
:检查文件流是否到达文件末尾ferror
:检查文件流是否发生错误
perror
函数
perror
函数用于打印错误信息,其基本语法如下:
void perror(const char *str);
示例代码:
#include <stdio.h>
int main() {
FILE *file;
file = fopen("nonexistent.txt", "r");
if (file == NULL) {
perror("Error opening file");
return 1;
}
fclose(file);
return 0;
}
clearerr
函数
clearerr
函数用于清除文件流的错误标志,其基本语法如下:
void clearerr(FILE *stream);
feof
和 ferror
函数
feof
函数用于检查文件流是否到达文件末尾,其基本语法如下:
int feof(FILE *stream);
ferror
函数用于检查文件流是否发生错误,其基本语法如下:
int ferror(FILE *stream);
示例代码:
#include <stdio.h>
int main() {
FILE *file;
char ch;
file = fopen("example.txt", "r");
if (file == NULL) {
perror("Error opening file");
return 1;
}
while ((ch = fgetc(file)) != EOF) {
putchar(ch);
}
if (feof(file)) {
printf("\nEnd of file reached.\n");
} else if (ferror(file)) {
printf("\nAn error occurred.\n");
}
fclose(file);
return 0;
}
结论
<stdio.h>
库是C标准库中最基础和最重要的部分之一,提供了一组强大的函数用于处理输入输出操作。从标准输入输出函数到文件操作函数,从格式化输入输出函数到字符和字符串操作函数,再到错误处理函数,<stdio.h>
库涵盖了C语言程序设计中广泛的应用场景。通过深入理解和掌握这些函数,程序员可以编写出高效、健壮的C语言程序。希望本文对读者深入了解 <stdio.h>
库有所帮助。