C语言核心知识:条件编译、文件IO操作与客户信息管理系统实战
第15章 预处理指令详解
15.1 条件编译指令
条件编译允许程序在编译阶段根据特定条件选择性地编译代码块,这与运行时的if-else语句类似,但工作在编译时期。
1. #if 指令
用于预处理器的条件判断,满足条件时内部的代码行会被编译,否则被编译器忽略。
单分支结构:
#if 条件表达式
// 代码块
#endif
双分支结构:
#if 条件表达式
// 条件为真时执行的代码
#else
// 条件为假时执行的代码
#endif
多分支结构:
#if 条件表达式1
// 条件1为真时执行的代码
#elif 条件表达式2
// 条件2为真时执行的代码
#elif 条件表达式3
// 条件3为真时执行的代码
#else
// 所有条件都为假时执行的代码
#endif
2. #ifdef 指令
用于判断某个宏是否已经被定义过。
单分支结构:
#ifdef 宏名称
// 宏已定义时执行的代码
#endif
双分支结构:
#ifdef 宏名称
// 宏已定义时执行的代码
#else
// 宏未定义时执行的代码
#endif
3. #if defined 指令
功能与#ifdef类似,但支持同时检查多个宏定义。
#if defined(宏名称1) || defined(宏名称2)
// 至少一个宏已定义时执行的代码
#endif
4. #ifndef 指令
用于判断某个宏是否未被定义,常用于防止头文件重复包含。
#ifndef 头文件名大写_H
#define 头文件名大写_H
// 头文件内容
#endif
预处理指令汇总
| 指令 | 功能说明 |
|---|---|
| #include | 包含其他源代码文件 |
| #define | 定义宏或常量 |
| #undef | 取消已定义的宏 |
| #if | 条件为真时编译后续代码 |
| #ifdef | 宏已定义时编译后续代码 |
| #ifndef | 宏未定义时编译后续代码 |
| #elif | 前序条件不满足且当前条件满足时编译 |
| #endif | 结束条件编译块 |
第16章 输入输出与文件操作
16.1 流的概念
输入流(Input Stream):数据从外部设备(如文件、键盘)传输到程序内存的通道。
输出流(Output Stream):数据从程序内存传输到外部设备(如文件、屏幕)的通道。
16.2 标准输入输出函数
输入函数
- scanf():格式化输入函数,支持多种数据类型
- getchar():从标准输入读取单个字符
函数原型:int getchar(void)
返回读取字符的ASCII码值 - gets():读取一行字符串(已不推荐使用)
注意:该函数存在安全风险,建议使用fgets()替代
输出函数
- printf():格式化输出函数
- putchar():输出单个字符到标准输出
函数原型:int putchar(int character) - puts():输出字符串并自动换行
函数原型:int puts(const char *str)
16.3 文件操作
标准文件指针
| 文件指针 | 对应设备 |
|---|---|
| stdin | 键盘(标准输入) |
| stdout | 屏幕(标准输出) |
| stderr | 屏幕(标准错误) |
文件打开与关闭
fopen()函数: FILE *fopen(const char *filename, const char *mode); 参数: filename - 要打开的文件名(可包含路径) mode - 打开模式 返回值:成功返回文件指针,失败返回NULL fclose()函数: int fclose(FILE *stream); 返回值:成功返回0,失败返回EOF
文件打开模式:
| r | 只读,文件不存在则失败 |
| w | 只写,文件不存在则创建,存在则清空 |
| a | 追加写,文件不存在则创建 |
| r+ | 读写,文件必须存在 |
| w+ | 读写,文件不存在则创建,存在则清空 |
| a+ | 读写,文件不存在则创建 |
文件读取函数
fscanf() - 格式化读取: int fscanf(FILE *stream, const char *format, ...); 从文件流中按格式读取数据 fgets() - 行读取(推荐使用): char *fgets(char *str, int num, FILE *stream); 读取一行或指定长度,保留换行符 fgetc() - 字符读取: int fgetc(FILE *stream); 每次读取一个字符
文件写入函数
fprintf() - 格式化写入: int fprintf(FILE *stream, const char *format, ...); fputs() - 字符串写入: int fputs(const char *str, FILE *stream); fputc() - 字符写入: int fputc(int character, FILE *stream);
第17章 客户信息管理系统项目
17.1 项目结构设计
本项目实现一个完整的客户信息管理系统的核心功能,包括菜单显示、客户添加、列表查看、客户删除等操作。
17.1.1 主菜单与程序框架
#include <stdio.h>
// 定义客户信息结构体
typedef struct {
int id; // 客户编号
char name[20]; // 客户姓名
enum {
MALE = 'm',
FEMALE = 'f'
} gender; // 客户性别
int age; // 客户年龄
char phone[11]; // 联系电话
char email[40]; // 电子邮箱
} Client;
// 客户数据存储数组
Client clients[100];
int clientCount = 0;
int main() {
int running = 1;
while (running) {
printf("\n========== 客户信息管理系统 ==========");
printf("\n 1. 添加客户");
printf("\n 2. 删除客户");
printf("\n 3. 修改客户");
printf("\n 4. 客户列表");
printf("\n 5. 退出系统");
printf("\n 请选择(1-5): ");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
printf("添加客户功能");
break;
case 2:
printf("删除客户功能");
break;
case 3:
printf("修改客户功能");
break;
case 4:
printf("客户列表功能");
break;
case 5: {
char confirm;
printf("确定要退出系统吗(Y/N): ");
getchar();
scanf("%c", &confirm);
if (confirm == 'Y' || confirm == 'y') {
printf("感谢使用,再见!\n");
running = 0;
}
break;
}
default:
printf("输入选项无效,请重新选择!");
break;
}
}
return 0;
}
17.1.2 添加客户功能实现
#include <stdio.h>
typedef struct {
int id;
char name[20];
enum { MALE = 'm', FEMALE = 'f' } gender;
int age;
char phone[11];
char email[40];
} Client;
Client clients[100];
int clientCount = 0;
// 添加客户函数
void addClient() {
printf("\n========== 添加客户 ==========");
clients[clientCount].id = clientCount + 1;
printf("\n请输入姓名: ");
scanf("%s", clients[clientCount].name);
printf("请输入性别(m/f): ");
getchar();
scanf("%c", (char *)&clients[clientCount].gender);
printf("请输入年龄: ");
scanf("%d", &clients[clientCount].age);
printf("请输入电话: ");
scanf("%s", clients[clientCount].phone);
printf("请输入邮箱: ");
scanf("%s", clients[clientCount].email);
clientCount++;
printf("\n客户添加成功!");
}
int main() {
int running = 1;
while (running) {
printf("\n========== 客户信息管理系统 ==========");
printf("\n 1. 添加客户");
printf("\n 2. 删除客户");
printf("\n 3. 修改客户");
printf("\n 4. 客户列表");
printf("\n 5. 退出系统");
printf("\n 请选择(1-5): ");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
addClient();
break;
case 2:
printf("删除客户功能");
break;
case 3:
printf("修改客户功能");
break;
case 4:
printf("客户列表功能");
break;
case 5: {
char confirm;
printf("确定要退出系统吗(Y/N): ");
getchar();
scanf("%c", &confirm);
if (confirm == 'Y' || confirm == 'y') {
printf("感谢使用,再见!\n");
running = 0;
}
break;
}
default:
printf("输入选项无效,请重新选择!");
break;
}
}
return 0;
}
17.1.3 客户列表功能
#include <stdio.h>
typedef struct {
int id;
char name[20];
enum { MALE = 'm', FEMALE = 'f' } gender;
int age;
char phone[11];
char email[40];
} Client;
Client clients[100];
int clientCount = 0;
void addClient() {
printf("\n========== 添加客户 ==========");
clients[clientCount].id = clientCount + 1;
printf("\n请输入姓名: ");
scanf("%s", clients[clientCount].name);
printf("请输入性别(m/f): ");
getchar();
scanf("%c", (char *)&clients[clientCount].gender);
printf("请输入年龄: ");
scanf("%d", &clients[clientCount].age);
printf("请输入电话: ");
scanf("%s", clients[clientCount].phone);
printf("请输入邮箱: ");
scanf("%s", clients[clientCount].email);
clientCount++;
printf("\n客户添加成功!");
}
// 显示客户列表函数
void showList() {
printf("\n========== 客户列表 ==========");
if (clientCount == 0) {
printf("\n暂无客户信息,请先添加!");
return;
}
printf("\n编号\t姓名\t性别\t年龄\t电话\t邮箱");
for (int i = 0; i < clientCount; i++) {
printf("\n%d\t%s\t%c\t%d\t%s\t%s",
clients[i].id,
clients[i].name,
clients[i].gender,
clients[i].age,
clients[i].phone,
clients[i].email);
}
}
int main() {
int running = 1;
while (running) {
printf("\n========== 客户信息管理系统 ==========");
printf("\n 1. 添加客户");
printf("\n 2. 删除客户");
printf("\n 3. 修改客户");
printf("\n 4. 客户列表");
printf("\n 5. 退出系统");
printf("\n 请选择(1-5): ");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
addClient();
break;
case 2:
printf("删除客户功能");
break;
case 3:
printf("修改客户功能");
break;
case 4:
showList();
break;
case 5: {
char confirm;
printf("确定要退出系统吗(Y/N): ");
getchar();
scanf("%c", &confirm);
if (confirm == 'Y' || confirm == 'y') {
printf("感谢使用,再见!\n");
running = 0;
}
break;
}
default:
printf("输入选项无效,请重新选择!");
break;
}
}
return 0;
}
17.1.4 删除客户功能
#include <stdio.h>
#include <stdbool.h>
typedef struct {
int id;
char name[20];
enum { MALE = 'm', FEMALE = 'f' } gender;
int age;
char phone[11];
char email[40];
} Client;
Client clients[100];
int clientCount = 0;
void addClient() {
printf("\n========== 添加客户 ==========");
clients[clientCount].id = clientCount + 1;
printf("\n请输入姓名: ");
scanf("%s", clients[clientCount].name);
printf("请输入性别(m/f): ");
getchar();
scanf("%c", (char *)&clients[clientCount].gender);
printf("请输入年龄: ");
scanf("%d", &clients[clientCount].age);
printf("请输入电话: ");
scanf("%s", clients[clientCount].phone);
printf("请输入邮箱: ");
scanf("%s", clients[clientCount].email);
clientCount++;
printf("\n客户添加成功!");
}
void showList() {
printf("\n========== 客户列表 ==========");
if (clientCount == 0) {
printf("\n暂无客户信息,请先添加!");
return;
}
printf("\n编号\t姓名\t性别\t年龄\t电话\t邮箱");
for (int i = 0; i < clientCount; i++) {
printf("\n%d\t%s\t%c\t%d\t%s\t%s",
clients[i].id,
clients[i].name,
clients[i].gender,
clients[i].age,
clients[i].phone,
clients[i].email);
}
}
// 执行删除操作
bool removeClient(int targetId) {
if (targetId < 1 || targetId > clientCount) {
return false;
}
int index = targetId - 1;
// 将后续客户数据前移
for (int i = index; i < clientCount - 1; i++) {
clients[i] = clients[i + 1];
clients[i].id--;
}
clientCount--;
return true;
}
// 删除界面处理
void deleteView() {
int deleteId;
printf("\n请输入要删除的客户编号(-1取消): ");
scanf("%d", &deleteId);
if (deleteId == -1) {
printf("\n已取消删除操作");
return;
}
char confirm;
printf("确认删除该客户吗(Y/N): ");
getchar();
scanf("%c", &confirm);
if (confirm != 'Y' && confirm != 'y') {
printf("\n已取消删除操作");
return;
}
if (removeClient(deleteId)) {
printf("\n删除成功!");
} else {
printf("\n删除失败:该客户不存在!");
}
}
int main() {
int running = 1;
while (running) {
printf("\n========== 客户信息管理系统 ==========");
printf("\n 1. 添加客户");
printf("\n 2. 删除客户");
printf("\n 3. 修改客户");
printf("\n 4. 客户列表");
printf("\n 5. 退出系统");
printf("\n 请选择(1-5): ");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
addClient();
break;
case 2:
deleteView();
break;
case 3:
printf("修改客户功能");
break;
case 4:
showList();
break;
case 5: {
char confirm;
printf("确定要退出系统吗(Y/N): ");
getchar();
scanf("%c", &confirm);
if (confirm == 'Y' || confirm == 'y') {
printf("感谢使用,再见!\n");
running = 0;
}
break;
}
default:
printf("输入选项无效,请重新选择!");
break;
}
}
return 0;
}