C语言FILE详解(COME ON)

简介: 孔子曰:“学而不思则惘,思而不学则殆。”现将所了解的C语言FILE相关操作·知识汇总如下,请多多指教!

一,前言

孔子曰:“学而不思则惘,思而不学则殆。”现将所了解的C语言FILE相关操作·知识汇总如下,请多多指教!


二,基础知识

FILE结构

struct _iobuf {
         char *_ptr;    // 文件输入的下一个位置
         int   _cnt;    // 当前缓冲区位置
         char *_base;   // 文件起始位置
         int   _flag;   // 文件标志
         int   _file;   // 文件有效性验证
         int   _charbuf;    // 当前缓冲区状况
         int   _bufsiz;   // 缓冲区大小
         char *_tmpfname;  // 临时文件名
         };
  typedef struct _iobuf FILE;     //别名FILE,可以直接用

FILE文件操作

一,操作文件

1.fopen函数

打开数据文件


fopen(_In_z_ char const* _FileName,_In_z_ char const* _Mode);

即fopen(需要打开文件的文件名,打开文件的方式)


需要打开文件的文件名:


需要和exe文件在同一目录下,或者写出相对路径或绝对路径


打开文件的方式:

1.“r” 以"读"的方式打开一个文本文件(只能读)。
2.“r+” 在"r"的基础下增加了"写"。
3.“rb” 以"读"的方式打开一个二进制文件(只能读)。
4.“rb+” 在"rb"的基础下增加了"写"。
5.“w” 以"写"的方式创建一个文本文件,
如果这个文件已经存在,就会覆盖原来的文件。
6.“w+” 在"w"的基础下增加了"读"。
7.“wb” 以"写"的方式创建一个二进制文件。
8.“wb+” 在"wb"的基础下增加了"读"。
9.“a” 以"尾部追加"的方式打开一个文本文件(只能写)。
10.“a+” 在"a"的基础下增加了"读"。
11.“ab” 以"尾部追加"的方式打开一个二进制文件(只能写)。
12.“ab+” 在"ab"的基础下增加了"读"。
2.fclose函数

在文件操作完成后需将文件关闭


fclose(_Inout_ FILE* _Stream);

即fclose(文件名)


二,读写文件

1.fgets函数

按规则读取文件
// 成功返回缓冲区指针,失败返回 NULL。
fgets(
        _Out_writes_z_(_MaxCount) char* _Buffer,
        //接收文件内容的缓冲区指针    
        _In_                      int   _MaxCount,
        //读取的字节数
        _Inout_                   FILE* _Stream
        //文件对象指针
        );

示例:


拓展:可以以多少字节为一行读取


FILE* f = fopen("Hello.txt", "r");
    char buf[2048];
    while (fgets(buf, 2, f)) {
//buf[2048]即每行不超过2048个字节,2表示每次只读2个字节,f为文件指针
        cout << buf << endl;
    }

2.fputs函数

将字符串写入文件


// 成功返回非负值,失败返回 EOF(-1)
fputs(
        _In_z_  char const* _Buffer,// 要写入的字符串
        _Inout_ FILE*       _Stream // 指向 FILE 对象的指针
        );

示例:


FILE* f = fopen("Hello.txt", "r+");

fputs("what do you mean?",f);

3.fread函数

fread(
        _Out_writes_bytes_(_ElementSize * _ElementCount) void*  _Buffer,
        //读取的数据存放的内存的指针
        _In_                                             size_t _ElementSize,
        //每次读取的字节数  
        _In_                                             size_t _ElementCount,
        //读取次数  
        _Inout_                                          FILE*  _Stream
        //要读取的文件的指针
        );

4.fwrite函数

fwrite(
        _In_reads_bytes_(_ElementSize * _ElementCount) void const* _Buffer,
        //要输出数据的地址
        _In_                                           size_t      _ElementSize,
        //每次写入的字节数
        _In_                                           size_t      _ElementCount,
        //写入次数
        _Inout_                                        FILE*       _Stream
        //目标文件指针
        );

示例:


typedef struct book {
    char name[20];
    char author[20];
};
int main(){
book a;
FILE* f;
f = fopen("Hello.txt", "a");
fread(&a,sizeof(struct book), 1, f);
cin >> a.name >> a.author;
fwrite(&a, sizeof(struct book), 1, f);
fclose(f);
}

5.fprintf函数

fprintf(
        _Inout_                       FILE*       const _Stream,
        //文件指针
        _In_z_ _Printf_format_string_ char const* const _Format,
        //要写入的字符串
        ...)

6.fscanf函数

fscanf(
        _Inout_                      FILE*       const _Stream,
        //文件指针
        _In_z_ _Scanf_format_string_ char const* const _Format,
        //读取字符串
        ...)

示例:通过fprint,fscanf写书的入馆信息


//fprintf() 成功返回写入的字符的个数,失败则返回负数。
//fscanf() 返回参数列表中被成功赋值的参数个数。
#define _CRT_SECURE_NO_DEPRECATE
//不声明可能会报错,无碍
#include<stdio.h>
#include <stdlib.h>
#define N 2
struct book{
    char name[10];
    int num;
    int year;
} booka[N], bookb[N], *pa, *pb;
int main(){
    FILE *fp;
    int i;
    pa=booka;
    pb=bookb;
    if( (fp=fopen("D:\\Hello.txt","wt+")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    //从键盘读入数据,保存到booka
    printf("输入数据:书名,数量,入馆年份:\n");
    for(i=0; i<N; i++,pa++){
        scanf("%s %d %d", pa->name, &pa->num, &pa->year);   
    }
    pa = booka;
    //将booka中的数据写入到文件
    for(i=0; i<N; i++,pa++){
        fprintf(fp,"%s %d %d\n", pa->name, pa->num, pa->year);   
    }
    //重置文件指针
    rewind(fp);
    //从文件中读取数据,保存到bookb
    for(i=0; i<N; i++,pb++){
        fscanf(fp, "%s %d %d\n", pb->name, &pb->num, &pb->year);
    }
    pb=bookb;
    //将bookb中的数据输出到显示器
    for(i=0; i<N; i++,pb++){
        printf("%s  %d  %d\n", pb->name, pb->num, pb->year);
    }
    fclose(fp);
    return 0;
}
相关文章
|
存储 编译器 数据库
一文教会你C语言FILE【从0到1之C语言的文件操作】
在我们的学习中,文件操作是被我们忽略,但用的时候又记忆模糊的内容,今天我带领大家来学习一下。
102 0
C语言中的__FILE__、__LINE__和__func__等预定义
STDC_VERSION :如何实现复合C89整部1,则这个宏的值为19940SL;如果实现符合C99,则这个宏的值为199901L;否则数值是未定义
|
程序员 C语言
c语言_文件操作_FILE结构体小解释
参考文档来自:https://www.cnblogs.com/haore147/p/3648395.html 我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作。 在vs2013下的代码如下: #include #pragma warning(disable:4996)...
1506 0
|
Linux C语言 C++
__FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )
root@xuanfei-desktop:~/cpropram/2# cat global.h //头文件#ifndef CLOBAL_H        #define GLOBAL_H        #include         int funca(void);        int func...
1161 0
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
7天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
23 6
|
27天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10
|
20天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
26天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
53 7