C 语言学习笔记(三)--文件I/O

文件输入/输出

与文件通信

文件通常是在磁盘或固态硬盘上的一段已命名的存储区。

fopen()的模式字符串
模式字符串含义
“r”以读模式打开文件
“w”以写模式打开文件,把现有文件的长度截为0,如果文件不存在,则创建一个新文件
“a”以写模式打开文件,在现有文件末尾添加内容,如果文件不存在,则创建一个新文件
“r+”以更新模式打开文件(即可以读写文件)
“w+”以更新模式打开文件(即读写),如果文件存在,则将其长度截为0;如果文件不存在,则创建一个新文件
“a+”以更新模式打开文件(即读写),在现有文件的末尾添加内容,如果文件不存在,则创建一个新文件
“rb”、“wb”、“ab”、“ab+”、“a+b”、“wb+”、“w+b”、“ab+”、“a+b”与上一个模式类似,但是以二进制模式而不是文本模式打开文件
“wx”、“wbx” 、“w+x”、“wb+x"或"w+bx”(C11)类似非 x模式,但是如果文件已存在或以独占模式打开文件,则打开文件失败
1.1 文件模式

C提供两种文件模式:文本模式和二进制模式。
二进制模式:在二进制模式中,程序可以访问文件的每个字节。
文本模式:文本模式中,程序所见的内容和文件的实际内容不同,程序以文本模式读取文件时,把本地环境表示的行末尾或文件结尾映射为 C模式。

2.2 文件相关操作函数

fopen(filename, type): 第一个参数是文件路径和文件名,第二个参数是读取模式。
getc():从标准输入中获取一个字符。
putc(ch, fpout): 第一个参数是待写入的字符,第2个参数是文件指针。
读取到文件结尾,将返回一个特殊值 EOF.
fclose(fp)函数 关闭 fp 指定的文件,必要时刷新缓冲区。成功关闭 fclose()函数返回0,否则返回 EOF.
int ungetc(int c, FILE *fp)函数把 c指定的字符放回输入流中,
int fflush(FLLE *fp)函数引起输出缓冲区中所有的未写入数据被发送到 fp 指定的输出文件,这个过程称为刷新缓冲区。
int setvbuf( FILE *restrict fp, char * restrict buf, int mode, size_t size)函数创建了一个供标准 I/O 函数替换使用的缓冲区。再打开文件后且未对流进行其他操作之前,调用该函数,指针 fp 识别待处理的流,buf 指向待使用的存储区。如果 buf 的值不是 NULL,则必须创建一个缓冲区。变量 size 告诉 setvbuf()数组的大小。mode的选择如下:_IOFBF 表示完全缓冲(在缓冲区满时刷新);_IOLBF表示行缓冲(在缓冲区满时或写入一个换行符时);_IONBF 表示无缓冲,如果操作成功函数返回0,否则返回一个非零值。

2. 二进制 I/O:fread()和 fwrite()

size_t fwirte(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);把二进制数据写入文件。ptr 是待写入数据块的地址(需固定大小如:har s[1024])。size 表示待写入数据块的大小(以字节为单位),nmemb 表示待写入数据块的数量。fp指定待写入的文件。函数返回成功写入数据块的数量。
size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);参数同上
getc(FILE *fp),从 fp 指定的文件中获取一个字符。
putc(char *ch, FILE *fpout)第一个参数是待写入的字符,第二个参数是文件指针。
通常,输入函数 getc()、fgets()、fscanf()、fread()都从文件开始处按顺序读取文件。然而,fseek()和 ftell()把类似的功能扩展至更大的文件,与文件模式相比,二进制模式更容易进行随机访问。
#### 简单的例子

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void writefile();
int main()
{
    writefile();
    return 0;
}

void writefile()
{
    char *hello = "test write and fread funciton";
    char w[12];
    FILE *file = fopen("test.txt", "r+");
    if (file != NULL)
    {
        size_t a = fwrite(hello, 1, 120, file);
        if (a > 0)
        {
            printf("写入的数据量为=%ld", a);
        }
        else
        {
            printf("写入失败");
        }
        size_t b = fread(w, sizeof(char), 12, file);
        if (b > 0)
        {
            printf("读取成功%ld w = %s", b, w);
        }
        else
        {
            printf("读取失败%zu", b);
        }
        fclose(file);
    }
    else
    {
        printf("打开文件失败");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值