6 标准IO fopen/fclose

1. 标准IO与文件IO的对应函数

文件IO:                                             标准IO

open                                                 fopen

close                                                 fclose

lseek                                                 fseek, rewind

 

read                             读写函数比较多(分三类,全缓存、行缓存和无缓存)

write


2. fopen函数

FILE *fopen (const char *path, const char*mode);

返回值:FILE *  文件流指针,文件流指针类似于文件IO 中的文件描述符,定义成struct_IO_FILE,在/usr/include/libio.h ,里面包含读写缓存的首地址、大小、位置指针等。

  标准的输入流:stdin   0

    标准的输出流:stdout  1

标准的出错流:stderr   2

Mode:类似于文件IO的flag

r或rb

打开只读文件,该文件必须存在。

r+或r+b

打开可读写的文件,该文件必须存在。

w或wb

打开只写文件,若文件存在则文件长度清为0,即会擦些文件以

前内容。若文件不存在则建立该文件。

w+或w+b或wb+

打开可读写文件,若文件存在则文件长度清为零,即会擦些文件

以前内容。若文件不存在则建立该文件。

a或ab

以附加的方式打开只写文件。若文件不存在,则会建立该文件,

如果文件存在,写入的数据会被加到文件尾,即文件原先的内容

会被保留。

a+或a+b或ab+

以附加方式打开可读写的文件。若文件不存在,则会建立该文

件,如果文件存在,写入的数据会被加到文件尾后,即文件原先

的内容会被保留。

mode整理如下:

Ø  b:二进制文件

Ø  r: 只读方式打开文件,文件必须存在;

Ø  w或a:只写方式打开文件,文件不存在则创建;

区别: w等价O_TRUNC,a等价O_APPEND;    

Ø  +:读写方式打开文件,文件必须存在;

 

例:以读写方式打开一个文件,该文件必须存在:   r+

        以追加方式打开一个文件,若文件不存在,则创建: a或a+   


fopen创建的文件权限:0666 & (~umask)


3. fclose

int fclose(FILE *stream)

Ø  fclose()调用成功返回0,失败返回EOF,并设置errno 

Ø  在该文件被关闭之前,刷新缓存中的数据。如果标准I / O库已经为该流自动分配了一个缓存,则释放此缓存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Linux文本IO加密/解密代码的示例,使用了openssl库中的AES算法: ```c #include <openssl/aes.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define KEY_SIZE 256 #define BLOCK_SIZE 16 void encrypt_file(const char *in_filename, const char *out_filename, const char *key_str) { unsigned char key[KEY_SIZE/8]; AES_KEY aes_key; int bytes_read, bytes_written; unsigned char in_data[BLOCK_SIZE]; unsigned char out_data[BLOCK_SIZE]; FILE *in_file = fopen(in_filename, "rb"); FILE *out_file = fopen(out_filename, "wb"); // Convert key string to binary memset(key, 0, sizeof(key)); memcpy(key, key_str, strlen(key_str)); // Set encryption key AES_set_encrypt_key(key, KEY_SIZE, &aes_key); // Encrypt file while ((bytes_read = fread(in_data, 1, BLOCK_SIZE, in_file)) > 0) { AES_encrypt(in_data, out_data, &aes_key); bytes_written = fwrite(out_data, 1, bytes_read, out_file); } fclose(in_file); fclose(out_file); } void decrypt_file(const char *in_filename, const char *out_filename, const char *key_str) { unsigned char key[KEY_SIZE/8]; AES_KEY aes_key; int bytes_read, bytes_written; unsigned char in_data[BLOCK_SIZE]; unsigned char out_data[BLOCK_SIZE]; FILE *in_file = fopen(in_filename, "rb"); FILE *out_file = fopen(out_filename, "wb"); // Convert key string to binary memset(key, 0, sizeof(key)); memcpy(key, key_str, strlen(key_str)); // Set decryption key AES_set_decrypt_key(key, KEY_SIZE, &aes_key); // Decrypt file while ((bytes_read = fread(in_data, 1, BLOCK_SIZE, in_file)) > 0) { AES_decrypt(in_data, out_data, &aes_key); bytes_written = fwrite(out_data, 1, bytes_read, out_file); } fclose(in_file); fclose(out_file); } int main(int argc, char *argv[]) { if (argc != 4) { printf("Usage: %s <input file> <output file> <key>\n", argv[0]); exit(EXIT_FAILURE); } const char *in_filename = argv[1]; const char *out_filename = argv[2]; const char *key_str = argv[3]; encrypt_file(in_filename, "encrypted.tmp", key_str); decrypt_file("encrypted.tmp", out_filename, key_str); remove("encrypted.tmp"); printf("File %s encrypted and decrypted successfully.\n", in_filename); return 0; } ``` 这个例子中,我们使用了256位的AES算法,并将加密和解密操作封装到`encrypt_file`和`decrypt_file`函数中。我们还实现了一个简单的命令行接口,可以通过传递输入文件、输出文件和密钥来使用这些函数加密和解密文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值