c_day05_io

本文介绍了使用C语言进行文件操作的方法,包括文本文件的读写、复制非文本文件(如图片)、获取文件大小及实现文件内容的加密与解密等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include "string.h"
/*
//读取文本内容
void main(){


char path[] = "C:/Users/Administrator/Desktop/files/test.txt";
  //打开文本


FILE *fp = fopen(path, "r");
if (fp == NULL){
printf("文件获取失败!");
return;
      }


//读取
char buff[50];   //创建缓冲区
while (fgets(buff,50,fp)){
printf("%s",buff);
}
fclose(fp);


getchar();
}
*/
/*
//向文本中写入内容
void main(){
//创建输出路径
char path[] = "C:/Users/Administrator/Desktop/files/test_new.txt";
FILE *fp = fopen(path,"w");
char *msg = "我要在计划期内完成学习任务,这样才对的起自己的计划!\n 人没有梦想和咸鱼有什么区别!";
fputs(msg,fp);
//关闭流
fclose(fp);
getchar();
}
*/
/*
//复制非文本文件 eg: jpg图片复制
void main(){
char* path_r = "C:/Users/Administrator/Desktop/files/beauty.jpg";
char* path_w = "C:/Users/Administrator/Desktop/beauty_new.jpg";
//读取二进制文件 b字符表示朝族二进制的文件bianry
FILE* fr = fopen(path_r,"rb");
//写入
FILE* fw = fopen(path_w, "wb");
//复制文件
int buff[50]; //缓冲区
int len = 0; //每次读取的长度


while (len = fread(buff,sizeof(int),50,fr)){
  //将读到的内容写入新的文件中
fwrite(buff,sizeof(int),len,fw);
}


//关闭流
fclose(fr);
fclose(fw);
getchar();
}*/


/*


//获取文件的大小
void main(){
char* path_r = "C:/Users/Administrator/Desktop/files/beauty.jpg";
FILE *fp = fopen(path_r,"r");
//重新定位文件指针
//SEEK_END文件末尾,0偏移量
fseek(fp,0,SEEK_END);
//返回当前文建制镇,相对于开头的位置偏移量
long file_size = ftell(fp);
printf("%d\n",file_size/1024);
getchar();
}*/


/*
//exercise 文本文件加密/解密
//异或运算  规则 1^1=0 0^0=1 0^1 =1;同为0不同为1;
void crpypt(char* normal_path,char* crypt_path){
//打开文件
FILE *fp_r = fopen(normal_path, "r");
FILE *fp_w = fopen(crypt_path, "w");
//一次读取一个字符
int ch;
while ((ch = fgetc(fp_r))!=EOF){  //End of file -》EOF = -1
    //加密后写入文件
//(异或运算)
fputc(ch^8,fp_w);
}


fclose(fp_w);
fclose(fp_r);


}
void main(){
char* path_r = "C:/Users/Administrator/Desktop/files/test.txt";
char* path_w = "C:/Users/Administrator/Desktop/text_new.txt";      //^8
char* path_w2 = "C:/Users/Administrator/Desktop/text_new_dec.txt";  //^8  对同一个数字异或运算两次等于不变
crpypt(path_w,path_w2);
getchar();
}
*/




//exercise 非文件加密/解密
//密码:ilovelyf
void crpypt(char* normal_path, char* crypt_path,char password[]){
//打开文件
FILE *fp_r = fopen(normal_path, "rb");
FILE *fp_w = fopen(crypt_path, "wb");
//一次读取一个字符
int ch;
while ((ch = fgetc(fp_r)) != EOF){  //End of file -》EOF = -1
//加密后写入文件
//(异或运算)
int i = 0;
int pass_len = strlen(password);
fputc(ch ^ password[i%pass_len], fp_w);
i++;
}


fclose(fp_w);
fclose(fp_r);


}
void main(){
char* path_r = "C:/Users/Administrator/Desktop/files/beauty.jpg";
char* path_w = "C:/Users/Administrator/Desktop/beauty_new.jpg";      //^8
char* path_w2 = "C:/Users/Administrator/Desktop/beauty_dec.jpg";  //^8  对同一个数字异或运算两次等于不变
char* password = "ilovelyf";
//加密
crpypt(path_r, path_w,password);
//解密
crpypt(path_w, path_w2, password);
getchar();
}
<think>我们正在分析一个存储过程,其中包含一个CASE语句。用户提到要检查代码中是否存在潜在问题或错误,特别是关于CCI_MASTER分支中局部变量data未使用、可能的逻辑遗漏或潜在错误。但是,在提供的引用[1]中,并没有出现CCI_MASTER分支,也没有提到data变量。因此,我们需要重新审视用户的问题。 用户的问题中引用的代码片段是一个存储过程,其中使用了CASE语句,但用户的问题中却提到了“switch语句中不同case的处理”和“CCI_MASTER分支”,这似乎与引用[1]中的代码不符。因此,我们可能需要用户提供更多的上下文。 然而,由于用户要求我们参考上一次的问题和回答,我们回顾一下历史:上一次的问题是关于如何初始化一个`uint32_t *data`指针,我们给出了详细的初始化方法。而当前的问题突然转向了存储过程中的CASE语句和CCI_MASTER分支,并且提到了局部变量data未使用。 这可能是用户将两个不同的问题混淆了。因此,我们有两种可能: 1. 用户可能想继续讨论指针初始化的问题,但误引用了存储过程的代码。 2. 用户确实在询问存储过程代码中的问题,但存储过程代码中并没有出现CCI_MASTER分支和data变量。 考虑到用户的问题中明确提到了“CCI_MASTER分支中局部变量data未使用”,而引用[1]中并没有这个分支,我们无法直接分析。 但是,我们可以根据用户提供的存储过程代码(引用[1])来检查其中可能存在的问题: 引用[1]中的存储过程代码: ```sql DELIMITER $$ CREATE PROCEDURE test3(IN p_day INT) BEGIN CASE WHEN p_day = 0 THEN SELECT "星期天"; WHEN p_day = 1 THEN SELECT "星期一"; ELSE SELECT "星期二"; END CASE; END$$ ``` 测试调用: ```sql CALL test3(2); -- 注意用户写的是test2(2),但过程名是test3,可能是笔误 ``` ### 分析该存储过程的问题: 1. **过程名和调用不一致**:用户写的是`CALL test2(2)`,但创建的是`test3`,这可能是笔误。调用时应该使用`test3`。 2. **CASE语句的覆盖范围**:当前CASE语句只处理了0、1和其他情况(返回星期二)。如果p_day为3、4等,也会返回星期二。这符合ELSE分支的设计,但可能不符合实际需求(实际可能需要返回星期三、四等)。所以,这里逻辑上是否完整取决于需求。 3. **存储过程语法**:在MySQL中,CASE语句有两种形式: - 简单CASE:`CASE p_day WHEN 0 THEN ...` - 搜索CASE:`CASE WHEN p_day=0 THEN ...` 这里使用的是搜索CASE,语法正确。 4. **返回值**:每个分支都使用SELECT返回一个字符串。在存储过程中,这样会返回一个结果集。如果调用者期望返回多个字段或者不同的形式,可能需要调整。 5. **参数范围**:参数p_day是整数,但只处理了0和1,其他都返回星期二。如果传入负数或大于6的值,也返回星期二,这可能是设计如此。 6. **缺少默认分支**:实际上,ELSE分支就是默认分支,所以这里没有问题。 ### 关于用户提到的“CCI_MASTER分支”和“局部变量data未使用”: 在提供的代码中并没有出现。因此,我们无法分析。可能用户指的是另一段代码。 ### 建议: 1. 如果用户确实是想分析存储过程,那么请提供完整的包含CCI_MASTER分支的代码。 2. 如果用户是想继续讨论指针初始化的问题,那么请明确问题。 ### 当前存储过程代码的修正建议: 1. 修正过程名和调用名一致。 2. 如果需求是返回星期几,那么应该覆盖0到6,分别对应星期天到星期六。修改如下: ```sql DELIMITER $$ CREATE PROCEDURE test3(IN p_day INT) BEGIN CASE WHEN p_day = 0 THEN SELECT "星期天"; WHEN p_day = 1 THEN SELECT "星期一"; WHEN p_day = 2 THEN SELECT "星期二"; WHEN p_day = 3 THEN SELECT "星期三"; WHEN p_day = 4 THEN SELECT "星期四"; WHEN p_day = 5 THEN SELECT "星期五"; WHEN p_day = 6 THEN SELECT "星期六"; ELSE SELECT "无效输入"; END CASE; END$$ ``` 这样修改后,对于0~6的输入返回对应的星期几,其他输入返回“无效输入”。 ### 结论: 由于用户的问题中提到的CCI_MASTER分支和局部变量data未使用在提供的代码中不存在,我们无法分析。但就提供的存储过程代码而言,主要问题是分支覆盖不全(根据需求)和调用时过程名不一致。 ### 相关问题: 1. MySQL存储过程中CASE语句和IF语句有什么区别? 2. 如何优化存储过程以处理多个条件分支? 3. 在存储过程中如何定义和使用局部变量? 4. 如何避免存储过程调用中的常见错误?</think>### 分析存储过程代码中的潜在问题 您提供的存储过程代码存在几个关键问题,我将逐一分析 CASE 语句和相关逻辑: ```sql DELIMITER$$ CREATE PROCEDURE test3(IN p_day INT) BEGIN CASE WHEN p_day = 0 THEN SELECT "星期天"; WHEN p_day = 1 THEN SELECT "星期一"; ELSE SELECT "星期二"; END CASE; END$$ ``` #### 主要问题分析: 1. **CASE 分支覆盖不全**: - 当前逻辑只处理了 0(星期天)、1(星期一) 和 其他所有情况(统一返回星期二) - 实际应有 7 种情况(0-6 对应周日至周六) - **风险**:输入 2-6 都会错误返回"星期二" 2. **ELSE 分支设计缺陷**: ```sql ELSE SELECT "星期二"; -- 覆盖范围过广 ``` - 应改为更精确的覆盖: ```sql WHEN p_day = 2 THEN SELECT "星期二"; WHEN p_day = 3 THEN SELECT "星期三"; ... ELSE SELECT "无效输入"; -- 添加错误处理 ``` 3. **参数验证缺失**: - 未检查 p_day 是否在有效范围 (0-6) - 输入负数或大于6的值时仍会执行ELSE分支 4. **调用不一致**: ```sql CALL test2(2); -- 过程名应为 test3 ``` - 存储过程名为 `test3` 但调用时使用 `test2` #### 关于 CCI_MASTER 分支的特别说明 虽然您的问题中提到 CCI_MASTER 分支和局部变量 data,但在提供的代码中: 1. 未出现 `CCI_MASTER` 标识符 2. 未声明或使用 `data` 变量 3. 无明显的逻辑遗漏点(基于当前代码) **建议**:如果存在涉及 CCI_MASTER 的代码段,请提供完整上下文以便进一步分析未使用的 data 变量问题。 #### 修复方案 ```sql DELIMITER$$ CREATE PROCEDURE test_day(IN p_day INT) BEGIN CASE p_day -- 直接对参数进行匹配 WHEN 0 THEN SELECT "星期天"; WHEN 1 THEN SELECT "星期一"; WHEN 2 THEN SELECT "星期二"; WHEN 3 THEN SELECT "星期三"; WHEN 4 THEN SELECT "星期四"; WHEN 5 THEN SELECT "星期五"; WHEN 6 THEN SELECT "星期六"; ELSE SELECT "错误:请输入0-6的数字"; END CASE; END$$ -- 正确调用 CALL test_day(2); -- 返回"星期二" ``` ### 最佳实践建议 1. **添加参数验证**: ```sql IF p_day < 0 OR p_day > 6 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '无效输入:日期值需在0-6之间'; END IF; ``` 2. **使用枚举类型**: ```sql CREATE TYPE weekday AS ENUM ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); ``` 3. **返回结果集替代直接输出**: ```sql CREATE FUNCTION get_weekday(day INT) RETURNS VARCHAR(10) DETERMINISTIC BEGIN RETURN ELT(day + 1, 'Sun','Mon','Tue','Wed','Thu','Fri','Sat'); END$$ ``` ### 测试用例建议 | 输入值 | 预期输出 | 当前代码输出 | |--------|----------------|--------------| | 0 | 星期天 | 星期天 | | 1 | 星期一 | 星期一 | | 2 | 星期二 | **星期二** | | 3 | 星期三 | **星期二** | | 7 | 错误提示 | **星期二** | | -1 | 错误提示 | **星期二** | [^1]: 原始代码引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值