C语言文件处理总结

本文详细介绍了C语言中文件处理的步骤和具体操作,包括定义文件、打开文件、读写文件(字符、字符串、格式、块)以及关闭文件。重点讨论了fputc/fgetc、fputs/fgets、fscanf/fprintf、fread/fwrite等函数的使用,并提供了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、读写文件步骤

  • 打开文件
  • 读写文件
  • 关闭文件

二、具体操作

1. 定义文件

FILE *fp;        /* 文件指针file pointer*/

2. 打开文件

FILE *fp fopen(const char *filename, const char *mode)        /* 文件指针file pointer,正常返回一个fp指针,失败返回NULL*/

参数:

  • filename:文件名,如“demo.txt", “D:\\code\\demo.txt”
  • mode:读写的模式。
名称用法
w只写,(文件不存在时创建文件,如果有文件则覆盖
r只读,(文件不存在时报错)
a追加,文件不存在时报错
w+可读可写,(文件不存在创建文件)
r+可读可写,(文件不存在时报错)
a+可读可写,(文件不存在时报错)
wb二进制写,与w类似
rb二进制读,与r类似
ab二进制追加,与a类似
Notewb+,rb+,ab+都是二进制操作,可读可写
/* 下面是打开文件的一个例子*/
fp = fopen("demo.txt", "w");    /* 写的方式打开一个文件,如果没有回创建*/
if (fp == NULL)
{
	printf("Error: Failure to open demo.txt\n");
	exit(0);
}
/************************************************************/
/*下面的程序与上面功能一项,比较简洁。建议使用下面的程序*/
if ((fp = fopen("demo.txt", "w") == NULL))
{
	printf("Error: Failure to open demo.txt\n");
	exit(0);
}

3. 读写文件(4种方式分别介绍)

  • 字符 读写:fputc,fgetc
  • 字符串 读写:fputs,fgets
  • 格式 读写:fscanf,fprintf
  • 读写:fread,fwrite

3.1 按 字符 读写:fputc,fgetc

下面给出两个例子:

Example 1:
/*例子1:将一串字符写入demo.txt文件中,以换行符结束 */
#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp;
    char ch;
    if ((fp = fopen("demo.txt", "w")) == NULL)
    {
        printf("Error: Failure to open demo.txt");
        exit(0);
    }
    ch = getchar();			
    while(ch != '\n')       /* 当遇到换行符时直接退出*/
    {
        fputc(ch, fp);		/* 按字符串写入到fp所指向的文件中*/
        ch = getchar();
    }
    fclose(fp); /*打开文件和关闭文件一定是成对出现的*/
    return 0;
}

输入下面的内容:Rome was not built in a day.并回车。
在这里插入图片描述
打开Rome.txt文件,结果如下:
在这里插入图片描述

Example 2:
/*例子2:把0~127的ASCII字符输入到demo.bin二进制文件中,并且从demo.bin文件中读出*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *fp;
    char ch;
    int i;
    if ((fp = fopen("demo.bin", "wb")) == NULL)
    {
        printf("Error:Failure to open demo.bin\n");
        exit(0);
    }
    for (i = 0; i < 128; i++)
    {
        fputc(i, fp);
    }
    fclose(fp);

    /* 上面写完成,下面开始读*/

    if ((fp = fopen("demo.bin", "rb")) == NULL)
    {
        printf("Error:Failure to open demo.bin\n");
        exit(0);
    }
    while((ch = fgetc(fp)) != EOF)
    {
        putchar(ch);
    }
    fclose(fp);
    return 0;
}

读出的二进制文件结果如下:在这里插入图片描述

3.2. 按 字符串 读写:fputs,fgets

3.3. 按 格式 读写:fscanf,fprintf

如果有一个 数据结构体 (学生),里面有学生学号,姓名,年龄,出生日期等信息,非常复杂,这个时候上面的输入方式就很难完成效果了,这个时候就用 “按格式写入和读出” 的方式。

Example 3:
#include <stdio.h>
#include <stdlib.h>
typedef struct date
{
    int year;
    int month;
    int day;
} DATE;
typedef struct student
{
    long studentID;
    char studentName[10];
    char studentSex;
    DATE birthday;
    int score[4];
} STUDENT;
int main()
{
    FILE *fp;
    STUDENT stu[10];
    int i, j;
    int n, m = 4; /* n:学生数,m:课程数*/
    printf("Input number of students:\n");
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        printf("Input Num.%d student:\n", i + 1);
        scanf("%ld %s %c %d %d %d", &stu[i].studentID, stu[i].studentName, &stu[i].studentSex,
              &stu[i].birthday.year,
              &stu[i].birthday.month,
              &stu[i].birthday.day);
        for (j = 0; j < m; j++)
        {
            scanf("%d", &stu[i].score[j]);
        }
    }
    /* 按格式写入文件*/
    if ((fp = fopen("demo.txt", "w")) == NULL)
    {
        printf("Error: Failure to open demo.txt\n");
        exit(0);
    }
    for (i = 0; i < n; i++)
    {
        fprintf(fp, "%10ld%8s%3c%6d/%02d/%02d",stu[i].studentID, stu[i].studentName, stu[i].studentSex,
            stu[i].birthday.year,
            stu[i].birthday.month,
            stu[i].birthday.day);
        for (j = 0; j < m; j++)
        {
            fprintf(fp, "%4d", stu[i].score[j]);
        }
        fprintf(fp, "\n");
    }

    return 0;
}

输入:(输入信息并按回车)
在这里插入图片描述
输出:
在这里插入图片描述
Note : 如果要读出的话,则用fscanf就行了。

3.4. 按读写:fread,fwrite

4. 关闭文件

int fclose(*fp);       /* 关闭 fp指针所对应的文件 */
Note:打开文件和关闭文件必定是成对存在的。


三、其他函数

  1. fseek(fp,offset,fromwhere) 定位函数,把fp的指针设为从fromwhere的位置加上offset的偏移。其中fromwhere有3个值。
  • SEEK_SET / 0 文件起始位置
  • SEEK_CUR / 1 文件当前位置
  • SEEK_END / 2 文件结束位置
  1. rewind(fp);  使指针回到文件头部。
  2. long ftell(fp); 返回当前位置的指针(相对于文件起始位置的字节偏移量)

四、参考文献与感谢

本篇文章是看过哈工大苏小红老师的视频后总结的。老师讲的透彻且通俗易懂,表示感谢!!!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值