fscanf函数进阶指南:处理复杂格式化数据的秘籍
发布时间: 2024-07-11 09:41:45 阅读量: 73 订阅数: 31
C语言 格式化读写文件详解
5星 · 资源好评率100%
![fscanf函数进阶指南:处理复杂格式化数据的秘籍](https://img-blog.csdnimg.cn/6d136748809a4248ba539893ba26362e.png)
# 1. fscanf函数基础
fscanf函数是C语言中用于从文本文件或标准输入中读取格式化数据的函数。它允许您根据指定的格式化字符串从输入中提取特定类型的数据。
fscanf函数的语法如下:
```c
int fscanf(FILE *stream, const char *format, ...);
```
其中:
* `stream`:指向输入文件的FILE指针。
* `format`:一个格式化字符串,指定要从输入中提取的数据类型和格式。
* `...`:要提取的数据变量的地址。
# 2. fscanf 函数的格式化字符
fscanf 函数使用格式化字符来指定要从输入流中读取的数据类型和格式。格式化字符必须按照特定顺序排列,与输入流中的数据项一一对应。
### 2.1 基本格式化字符
基本格式化字符用于读取基本数据类型,包括整数、浮点数和字符。
#### 2.1.1 整数类型:%d、%i、%u
* **%d**:读取带符号十进制整数。
* **%i**:与 %d 相同,用于读取带符号十进制整数。
* **%u**:读取无符号十进制整数。
#### 2.1.2 浮点数类型:%f、%e、%g
* **%f**:读取浮点数,使用十进制指数表示法。
* **%e**:读取浮点数,使用科学计数法表示法。
* **%g**:读取浮点数,使用 %f 或 %e 中更紧凑的表示法。
#### 2.1.3 字符类型:%c
* **%c**:读取单个字符。
### 2.2 扩展格式化字符
扩展格式化字符用于读取更复杂的数据类型,包括字符串、指针和其他特殊字符。
#### 2.2.1 字符串类型:%s
* **%s**:读取字符串,直到遇到空格、制表符或换行符。
#### 2.2.2 指针类型:%p
* **%p**:读取指针,并将其转换为十六进制表示。
#### 2.2.3 其他特殊字符:%n、%*
* **%n**:读取已成功读取的字符数。
* **%***:跳过输入流中指定数量的字符。
### 代码示例
```c
#include <stdio.h>
int main() {
int age;
float weight;
char name[20];
FILE *fp = fopen("input.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
fscanf(fp, "%d %f %s", &age, &weight, name);
printf("Age: %d, Weight: %.2f, Name: %s\n", age, weight, name);
fclose(fp);
return 0;
}
```
**逻辑分析:**
* `fscanf` 函数使用格式化字符串 `"%d %f %s"` 从文件 `input.txt` 中读取数据。
* 格式化字符串指定读取三个数据项:一个整数(%d)、一个浮点数(%f)和一个字符串(%s)。
* 这些数据项存储在变量 `age`、`weight` 和 `name` 中。
* `printf` 函数打印读取到的数据。
### 表格:fscanf 函数的格式化字符
| 格式化字符 | 数据类型 | 说明 |
|---|---|---|
| %d | 带符号十进制整数 | |
| %i | 带符号十进制整数 | 与 %d 相同 |
| %u | 无符号十进制整数 | |
| %f | 浮点数(十进制指数表示法) | |
| %e | 浮点数(科学计数法表示法) | |
| %g | 浮点数(更紧凑的表示法) | |
| %c | 字符 | |
| %s | 字符串 | |
| %p | 指针 | |
| %n | 已成功读取的字符数 | |
| %* | 跳过指定数量的字符 | |
# 3. fscanf函数的格式化修饰符
### 3.1 长度修饰符
长度修饰符用于指定要读取数据的类型大小,它可以应用于整数、浮点数和指针类型。
- **h:** 表示短整型(short int),占用 2 个字节。
- **l:** 表示长整型(long int),占用 4 个字节。
- **ll:** 表示长长整型(long long int),占用 8 个字节。
```c
#include <stdio.h>
int main() {
short int short_int;
long int long_int;
long long int long_long_int;
fscanf(stdin, "%hd", &short_int);
fscanf(stdin, "%ld", &long_int);
fscanf(stdin, "%lld", &long_long_int);
printf("Short int: %d\n", short_int);
printf("Long int: %ld\n", long_int);
printf("Long long int: %lld\n", long_long_int);
return 0;
}
```
**逻辑分析:**
* 使用 `%hd` 格式化修饰符读取一个短整型值。
* 使用 `%ld` 格式化修饰符读取一个长整型值。
* 使用 `%lld` 格式化修饰符读取一个长长整型值。
### 3.2 宽度修饰符
宽度修饰符用于指定字段的最小宽度,它可以应用于字符串和指针类型。
- **n:** 指定字段的最小宽度,如果输入值小于指定宽度,则用空格填充。
- ***:** 动态指定字段宽度,它将读取输入直到遇到空格或换行符。
```c
#include <stdio.h>
int main() {
char string[20];
char *pointer;
fscanf(stdin, "%10s", string);
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
fscanf(stdin, "%*s");
```
0
0