C语言 流文件

抽象化的IO操作被封装,流

printf和scanf借助于标准输入和输出流stdin,stdout特殊的由C标准库管理的文件流

带用户态缓冲区的文件流,流也可以不带缓冲区。

输入流缓冲区只要有就可以读,不能刷新(未定义行为)。输出流缓冲区需要手动刷新。

stdout 行缓冲区 换行符会自动刷新,可以用fflush函数手动刷新

文件输出缓冲区,装满会自动刷新,当然程序退出也会刷新。

流文件的输入和输出是按顺序的,提供接口不用了解怎么输出输入

流文件需要手动开关

缓冲区可以整合数据,一个字符一个字符的输入,会被放到缓冲区中,减少对于底层访问降低速度差提高性能。缓冲区同样可以阻塞。

文件流:文件流有相应的文件缓冲区,平衡内存和设备之间的性能差距

标准流(Standard Streams)可以视为特殊的文件流

<stdio.h> 头文件中提供了 3 个标准流:stdin, stout, stderr

stderr是不借助于缓冲区的

打开和关闭文件流:fopen 和 fclose

FILE* fopen(const char* filename, const char* mode);
FILE*fp =fopen("1.txt", "r);
if(fp == NULL)

可以理解FILE*指针为一个读或者是写的指针的集合

filename:放绝对路径或者是相对路径

mode:文件的打开模式:r:只写,r+ : 可读可写模式 (都是只能小写r)

r和r+模式不会文件截断

a:(append)追加模式

w:只写模式,此时打开文件若不存在会自动创建一个再写入,如果文件存在会截断再写入

比如用w模式打开文件,在fopen函数调用的那一行就已经对原文件做出了处理截断清空处理

w+:可读写 a+:追加可读写

以二进制文件的模式打开一个文件 rb,wb, ab, rb+,wb+, ab+

windows平台下有这两个文件的区别但是别的没有

windows平台下换行符是两个字符实际上,是回车+换行。因此必须区分文本文件和二进制文件:换行是\r\n 二进制是\n,也因此别的平台没有必要区分

Unixs平台下只是一个换行字符

任何情况,读指针都是从开头,写指针的位置与模式有关。

若打开文件失败会返回一个NULL指针

路径分隔符:windows文件路径分隔符使用的是“\\”    盘符开头一定是一个绝对路径名

                     类Unix操作系统文件分隔符使用的是“/” (目前windows也可以识别)

 绝对路径一定安全,相对路径查找更便利(直接把文件放在对应文件夹中,可以直接访问)

相对路径是在文件在改变位置以后,可能会出现招不到文件的情况

读文件的方式:

1. 一个字符一个字符的读

fgetc函数:从文件流中读到一个字符。

fputc函数:将一个字符写入文件流。

int fgetc(FILE* stream);
int fputc(int c, FILE* stream);
//成功会返回放置元素的ASCII
fputc("1", fp);//会变为ASCII码数字
fflush(fp);

//对比
fgetc(stdin) = getchar();
fputc(c, stdout) = putc();
rewind(fp);

//一定注意文件指针的位置!

文件指针位置的问题,c语言输入和输出只有一个流,不像c++或者是jave有两个流,因此说当开始读文件然后再写文件的时候就相当于追加写入。如果不想追加写入还是想移到开头进行覆盖写入就用rewind。

因此在模式选择的时候权限要少给,只是满足够用就可以,只读就r, 只写就w,追加模式打开就a

当执行完输出操作以后,要进行自己的手动刷新,不然只是放在缓冲区中没有放在文件中

输入的最后一个字符是EOF结束,是-1

返回值是int类型,因为返回的是ASCII类型

区分fgets与fputs函数

char* fgets(char* str, int count, FILE* stream);

str是指向字符数组的指针,count是字符串的长度,stream任意输入流

实际上最多读取count-1个字符最后的结束字符不会读入

printf:标准化方式向输出流输出数据
fprintf:以格式化形式向文件流输出数据

int fprintf(FILE* stream, const char* format, ...), 输出错误信息就fprintf(stderr, const char* format, ...),如果是fprintf(stdout, ...)

sprintf:以格式化方式向一个字符数组输出数据,保证输出目的地是一个字符串

sprintf(char* str, const char* format, ...)

scanf:以格式化方式从标准输入流读数据,默认从键盘读数据

fscanf:以格式化方式从文件流中读取信息

fscanf(FILE* ftream, const char* format, ...)

fscanf(dest, "str = %s,a = %d,b = %lf,c = %c", str2, &a2, &b2, &c2);

读字符串时会将分隔符,读入 用%[^,]都字符串读到,就结束了此时空格不会结束

fscanf(dest, "str = %[^,], a = %d,b = %lf,c = %c", str2, &a2, &b2, &c2);

sscanf:

一下函数都处理文本文件,不要用于处理二进制文件

fgetc/fputc,fgets/futs,fprintf/fscanf

有专门的一对函数(处理文件)处理二进制文件fread和fwrite

fread和fwrite可以读写一大段数据,返回值类型是size_t,表示有多少个数据被读或者写

fseek和ftell是获取文件大小的常用的手段。

相关推荐

  1. C语言 文件

    2024-04-22 23:30:04       27 阅读
  2. C++ 文件

    2024-04-22 23:30:04       54 阅读
  3. C# —— FileStream文件

    2024-04-22 23:30:04       23 阅读
  4. C语言】通过fgets和fscanf了解读写文件的概念

    2024-04-22 23:30:04       22 阅读
  5. C语言——文件

    2024-04-22 23:30:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 23:30:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 23:30:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 23:30:04       82 阅读
  4. Python语言-面向对象

    2024-04-22 23:30:04       91 阅读

热门阅读

  1. 【算法】选择排序

    2024-04-22 23:30:04       31 阅读
  2. vue用法示例(一)

    2024-04-22 23:30:04       34 阅读
  3. 【Node】Node.Js--fs文件系统模块

    2024-04-22 23:30:04       35 阅读
  4. node.js 模版引擎

    2024-04-22 23:30:04       34 阅读
  5. 报错:Property glob does not exist on type ImportMeta

    2024-04-22 23:30:04       30 阅读
  6. live2d看板娘资源-地址

    2024-04-22 23:30:04       34 阅读