首页 > 其他分享 >C-文件读写

C-文件读写

时间:2023-04-15 11:23:31浏览次数:46  
标签:fp 文件 字符 int 读写 写入 FILE

文件读写

#include <stdio.h>

读取文件

  • FILE *fopen(char *filename, char *mode);

参数说明:

打开方式 说明
"r" 以只读方式打开文件.
文件必须存在, 否则打开失败.
"w" 以写入方式打开文件.
如果文件不存在, 那么创建一个新文件; 如果文件存在, 那么清空文件内容.
"a" 以追加方式打开文件.
如果文件不存在, 那么创建一个新文件; 如果文件存在, 那么将写入的数据追加到文件的末尾.
"r+" 以读写方式打开文件.
文件必须存在, 否则打开失败.
"w+" 以写入/更新方式打开文件, 相当于wr+叠加的效果.
如果文件不存在, 那么创建一个新文件; 如果文件存在, 那么清空文件内容.
"a+" 以追加/更新方式打开文件, 相当于ar+叠加的效果.
如果文件不存在, 那么创建一个新文件; 如果文件存在, 那么将写入的数据追加到文件的末尾.
"t" 文本文件. 如果不写, 默认为"t".
"b" 二进制文件.
  • int fgetc( FILE * fp );
    从 fp 所指向的输入文件中读取一个字符.
    返回值是读取的字符, 如果发生错误则返回 EOF.
  • char *fgets( char *buf, int n, FILE *fp );
    从 fp 所指向的输入流中读取 n - 1 个字符. 它会把读取的字符串复制到缓冲区, 并在最后追加一个 null 字符来终止字符串.
    如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF, 则只会返回读取到的字符, 包括换行符.
  • int fscanf(FILE *fp, const char *format, ...);
    从流 stream 读取格式化输入. 如果成功, 该函数返回成功匹配和赋值的个数; 如果到达文件末尾或发生读错误, 则返回 EOF.
    format: [=%[*][width][modifiers]type=]
    例: fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
类型 合格的输入 参数的类型
c 单个字符: 读取下一个字符. 如果指定了一个不为 1 的宽度 width, 函数会读取 width 个字符, 并通过参数传递, 把它们存储在数组中连续位置. 在末尾不会追加空字符 char *
d 十进制整数: 数字前面的 + 或 - 号是可选的 int *
e, E, f, g, G 浮点数: 包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E, 以及一个十进制数字. 两个有效的实例 -732.103 和 7.12e4 float *
o 八进制整数 int *
s 字符串. 这将读取连续字符, 直到遇到一个空格字符 (空格字符可以是空白、换行和制表符) char *
u 无符号的十进制整数 unsigned int *
x, X 十六进制整数 int *

写入文件

  • int fputc(int c, FILE *fp);
    把参数 c 的字符值写入到 fp 所指向的输出流中.
    如果写入成功, 返回写入的字符; 如果发生错误, 则会返回 EOF.
  • int fputs(const char *s, FILE *fp);
    把字符串 s 写入到 fp 所指向的输出流中.
    如果写入成功, 它会返回一个非负值; 如果发生错误, 则会返回 EOF.
  • int fprintf(FILE *fp, const char *format, ...);
    发送格式化输出到流 stream 中. 如果成功, 则返回写入的字符总数, 否则返回一个负数.
    format: %[flags][width][.precision][length]specifier
    例: fprintf(fp, "%s %s %s %d", "We", "are", "in", 2023);
specifier (说明符) 输出
c 字符
d 或 i 有符号十进制整数
e 使用 e 字符的科学科学记数法 (尾数和指数)
E 使用 E 字符的科学科学记数法 (尾数和指数)
f 十进制浮点数
g 自动选择 %e 或 %f 中合适的表示法
G 自动选择 %E 或 %f 中合适的表示法
o 有符号八进制
s 字符的字符串
u 无符号十进制整数
x 无符号十六进制整数
X 无符号十六进制整数 (大写字母)
p 指针地址
n 无输出
% 字符
length (长度) 描述
h 参数被解释为短整型或无符号短整型 (仅适用于整数说明符: i、d、o、u、x 和 X)
l 参数被解释为长整型或无符号长整型, 适用于整数说明符 (i、d、o、u、x 和 X) 及说明符 c (表示一个宽字符) 和 s (表示宽字符字符串)
L 参数被解释为长双精度型 (仅适用于浮点数说明符: e、E、f、g 和 G)
.precision (精度) 描述
.number 对于整数说明符 (d、i、o、u、x、X): precision 指定了要写入的数字的最小位数. 如果写入的值短于该数, 结果会用前导零来填充. 如果写入的值长于该数, 结果不会被截断. 精度为 0 意味着不写入任何字符.
对于 e、E 和 f 说明符: 要在小数点后输出的小数位数.
对于 g 和 G 说明符: 要输出的最大有效位数.
对于 s: 要输出的最大字符数. 默认情况下, 所有字符都会被输出, 直到遇到末尾的空字符.
对于 c 类型: 没有任何影响.
当未指定任何精度时, 默认为 1. 如果指定时不带有一个显式值, 则假定为 0.
.* 精度在 format 字符串中未指定, 但是会作为附加整数值参数放置于要被格式化的参数之前.
width (宽度) 描述
(number) 要输出的字符的最小数目. 如果输出的值短于该数, 结果会用空格填充. 如果输出的值长于该数, 结果不会被截断.
* 宽度在 format 字符串中未指定, 但是会作为附加整数值参数放置于要被格式化的参数之前.
flags (标识) 描述
- 在给定的字段宽度内左对齐, 默认是右对齐 (参见 width 子说明符).
+ 强制在结果之前显示加号或减号 (+ 或 -), 即正数前面会显示 + 号. 默认情况下, 只有负数前面会显示一个 - 号.
(space) 如果没有写入任何符号, 则在该值前面插入一个空格.
# 与 o、x 或 X 说明符一起使用时, 非零值前面会分别显示 0、0x 或 0X. 与 e、E 和 f 一起使用时, 会强制输出包含一个小数点, 即使后边没有数字时也会显示小数点. 默认情况下, 如果后边没有数字时候, 不会显示显示小数点. 与 g 或 G 一起使用时, 结果与使用 e 或 E 时相同, 但是尾部的零不会被移除.
0 在指定填充 padding 的数字左边放置零 (0), 而不是空格 (参见 width 子说明符).

其他操作

  • int fclose( FILE *fp );
    如果成功关闭文件, fclose( ) 函数返回零; 如果关闭文件时发生错误, 函数返回 EOF.
    这个函数会清空缓冲区中的数据, 关闭文件, 并释放用于该文件的所有内存.
  • int fflush(FILE *stream);
    fflush(stdout): 将缓冲区中的内容写到stream所指的文件中去. 若stream为NULL, 则会将所有打开的文件进行数据更新.
    fflush(stdin): 刷新缓冲区, 将缓冲区内的数据清空并丢弃.
  • int setvbuf(FILE *stream, char *buffer, int mode, size_t size);
    定义流 stream 应如何缓冲. 如果成功, 则该函数返回 0, 否则返回非零值.
    • stream -- 指向 FILE 对象的指针, 该 FILE 对象标识了一个打开的流.

    • buffer -- 分配给用户的缓冲. 如果设置为 NULL, 该函数会自动分配一个指定大小的缓冲.

    • mode -- 指定了文件缓冲的模式:

      • _IOFBF -- 全缓冲, 对于输出, 数据在缓冲填满时被一次性写入; 对于输入, 缓冲会在请求输入且缓冲为空时被填充.
      • _IONBF -- 无缓冲, 每个 I/O 操作都被即时写入. buffer 和 size 参数被忽略.
      • _IOLBF -- 行缓冲, 对于输出, 数据在遇到换行符或者在缓冲填满时被写入, 具体视情况而定; 对于输入, 缓冲会在请求输入且缓冲为空时被填充, 直到遇到下一个换行符.
    • size -- 缓冲的大小, 以字节为单位.

#include <stdio.h>

int main()
{
    FILE* f = NULL;
    char str[50];
    if((f = fopen("E:\\test.txt", "rt")) != NULL)
    {
        while(fgets(str, 50, f) != NULL)
        {
            printf("%s", str);
        }
        fclose(f);  // 只有当成功打开文件才需要清空缓冲区
    }
    else
    {
        printf("Fail to open file!");
    }
    return 0;
}

标签:fp,文件,字符,int,读写,写入,FILE
From: https://www.cnblogs.com/khrushchefox/p/17320736.html

相关文章

  • CIT 5930 文件I/O输入输出
    CIT5930|Assignment:C-FileI/O–MakingtheLC4Assembler|1SettingupCodioandMakefileforthisHW:1)OpentheCodioassignmentviaCanvas2)FromtheCodioFile-Treeclickon:assembler.c3)Makefilemustimplementthese3targets–all,clean,cl......
  • 如何配置.h头文件include“”相对路径
    编译工程时,找的是当前main.c文件下的.h文件,如果当前路径下没有就会报错,当前路径用.\表示,上一级目录用..\表示。如果你的main.h文件在main.c的上一级目录中Include文件夹内,这样来表示:#include“..\Include\main.h”总结:编译工程时找的是当前程序文件目录下的.h文件。—————......
  • “文件协作”到底是什么意思?
    伴随着信息化的发展,文件从直至存储变成了线上存储,现代职场中文件协作的概念也不再陌生,“文件协作”一词到底是什么意思呢?文档协作是指通过第三方工具,对项目文件进行实时协作。这个词经常与网盘工具一起出现,企业网盘可以帮助团队实现即使分隔多地,也可以与团队成员共同办公,将距离影......
  • #yyds干货盘点#Linux之find:查找目录下的文件
    【功能说明】find命令用于查找目录下的文件,同时也可以调用其他命令执行相应的操作。【语法格式】find[-H][-L][-P][-Ddebugopts][-olevel][pathname][expression]find[选项][路径][操作语句]1)注意find命令以及后面的选项和路径、操作语句,每个......
  • python分段读取word文件数据到MySQL数据库和Java读取word数据到MySQL数据库
    1、python分段读取word文件数据到MySQL数据库示例:(注:此示例为读取某个文件夹下的所有文件,并对文件后缀名为doc的文件进行读取,并以文件名称为id完成对该word内容的插入。)#导入os模块importos#导入所需库importpymysqlfromdocximportDocument#path定义要获取的......
  • X79G Xeon 2630v2 电脑 Hackintosh 黑苹果efi引导文件
    原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔)硬件型号驱动情况主板X79G处理器IntelXeon2630v2已驱动内存32g(16*22666MHZ)已驱动硬盘Intel760p512GB已驱动显卡RX470已驱动声卡瑞昱@英特尔HighDefinitionAudio控制器已驱动网卡英特尔EthernetConne......
  • 在 Linux 中使用 sFTP 上传或下载文件与文件夹
    导读sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与FTP(文件传输协议)类似。然而,sFTP比FTP更安全;它通过加密SSH传输处理所有操作。它可以配置使用几个有用的SSH功能,如公钥认证和压缩。它连接并登录到指定的远程机器,然后切换到交互式命令模式,在......
  • 使用appuploader工具发布证书和描述性文件教程
    使用APPuploader工具发布证书和描述性文件教程之前用AppCan平台开发了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到AppStore试试,于是找同学借了个苹果开发者账号,但没那么简单,还要用到Mac电脑的钥匙串申请发布证书和上传ipa,可没有Mac,同学的大老远的也不方便拿过来......
  • B/S上传大型视频文件到服务器,解决方案
    ​ 最近遇见一个需要上传超大大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表格数据、上传影音文件等。如果文件体积比较大,或者网络条件不好时,上传的时......
  • SpringCloud上传大型视频文件到服务器,解决方案
    ​文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦、缺乏交互、用户体验差。一、前端代码英国程序员RemySharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用HTML5的API,对文件上传进行渐进式增强:    * iframe上传 * ajax上传......