IO进线程(二)——IO

1. 按对象读写

读/输入

fread:
	#include <stdio.h>
	size_t fread(void *ptr,size_t size,size_t nmemb );

参数:
ptr :指向用来保存读取到的内容空间首地址;
size:要读取的单个对象(数据项)的大小
nmemb :要读取的对象(数据项)个数;
stream:输入流
返回值:成功返回实际读到的对象个数,读到文件的末尾或者失败返回0;
}

写/输出

fwrite:
	size_ _t fwrite(const void *ptr,size_ _t size, size_ _t nmemb,FIlE *stream);
{
	功能:向一个打开的文件()写入内容;
	参数:
		ptr//指向待写入的内容;
		size//要写入的单个对象(数据项)的大小
		nmemb//要写入的对象(数据项)的个数
		stream//输出流
	返回值:成功返回实际写入的对象个数;
}

2.判断文件的末尾/流出错

int feof(FILE *stream);
{
	读到文件末尾返回1,否则返回0;
}
int ferror(FILE *stream)
{
	流出错返回1,否则返回0;
}

3. 文件的定位

long ftell()(FILE *stream);
{
	功能:查看文件内部指针的位置;
	返回值:成功返回文件内部指针距离开头的偏移量;
}

void rewind(FILE *stream);
{
	功能:将文件内部指针置为开头;
}
int fseek(FILE *stream, 1ong offset, int whence);
{
	功能:对文件定位;
	参数:
		stream :文件流指针;
		offset:偏移量,
			负数:向左偏移;
			正输:向后偏移
		whence
			SEEK_SET:文件的开头
			SEEK_CUR: 文件内部指针的当前位置
			SEEK_END:文件的末尾
	返回值:成功返回0,识别返回-1并设置错误号;
}

实现对图片加密

//将图片的前十个字节读取出来,逆序 再写回到原位置–>加密

#include <stdio.h>
#include <string.h> // 正确引入头文件string.h
#include <stdlib.h>

// 函数声明
void mySwap(char *buf, int size);//

int main() 
{
    FILE *fp = fopen("1.jpg", "r+"); // 修改文件名为1.jpg,去掉空格
    if (NULL == fp) {
        perror("fopen");
        return 1; // 修改为1
    }
    char buf[32] = {0}; // 修改为大写字母O,初始化
    int ret = fread(buf, sizeof(buf), 10, fp); // 修正逗号错误
    printf("ret = %d\n", ret); // 添加换行符
    // 读到的内容逆序
    mySwap(buf, ret); // 调用函数mySwap
    // 将指针指向开头
    if (-1 == fseek(fp, 0, SEEK_SET)) 
    { // 修正了 fseek 的调用方式
        perror("fseek");
        return 1;
    }
    fwrite(buf, sizeof(char), ret, fp); // 修正了 fwrite 的调用参数
    fclose(fp); // 关闭文件
    return 0;
}

// 函数定义
void mySwap(char *buf, int size) {
    for (int i = 0; i < size / 2; i++) 
    {
        char temp = buf[i];
        buf[i] = buf[size - i - 1];
        buf[size - i - 1] = temp;
    }
}

4. 格式化输出

int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
{
	功能:向str指向的空间格式化输出;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h> // 修正头文件名称

int main() {
    int tem = 30;
    int hum = 50;
    int light = 1000;
    char buf[32] = {0}; // 修正数组初始化的写法
    sprintf(buf, "%d&%d&%d", tem, hum, light); // 修正sprintf函数参数错误
    printf("buf: %s\n", buf); // 修正printf函数参数错误,移除逗号后的空格
    return 0;
}

按照格式输入:

int sscanf(const char *str,const char *format, ...)
{
	将str里的数据按照格式输入到地址表当中;
}
#include <stdio.h>
#include <string.h>

int main() {
    int tem = 30;
    int hum = 50;
    int light = 1000;
    char buf[32] = {0};
    sprintf(buf, "%d&%d&%d", tem, hum, light);
    printf("buf: %s\n", buf);
    int var1, var2, var3; // 修正了变量名称
    sscanf(buf, "%d&%d&%d", &var1, &var2, &var3); // 修正了sscanf函数的调用参数
    printf("var1 = %d, var2 = %d, var3 = %d\n", var1, var2, var3); // 修正了printf函数的调用参数
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式石油工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值