06 C File

文件

文件基础

  1. 文本文件

    文本文件中每一个字节中的数据可以被解释为一个字符的ASCII码。文本文件可以用文本编辑器打开,显示为字符串

  2. 二进制文件

    二进制文件中每一个字节中的数据不能被解释为一个字符的ASCII码。如果用文本编辑器打开,也就是解释为ASCII码时,显示为不可读、无意义的字符串

  3. 文件名

    文件路径表示文件在磁盘中的文件夹位置,文件名主干,文件名后缀

    例:D:\CC\temp\file1.dat

  4. 文件结构体类型

    被使用的文件在内存中有相应的文件信息区,用来存放文件相关信息(文件名、文件状态、当前读写位置等)

    文件信息区是一个结构体变量,类型是FILE,包含在stdio.h

打开与关闭文件

访问文件步骤

  • 打开文件:为文件建立相应的文件信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)

  • 读写文件:以文本形式或者二进制形式读写文件中的数据

  • 关闭文件:销毁文件信息区和文件缓冲区所占用的内存

打开文件

FILE* fopen(const char* filename,const char* mode)

filename 要打开的文件名 mode 文件访问模式

返回被打开的文件的指针,失败返回 NULL

FILE* fp;
if ((fp = fopen("file1", "r")) == NULL)
{
    printf("cannot open this file\n");
    exit(0);
}
文件访问模式
  1. "r" 方式打开的文件只能用于从该文件读数据(输入),而不能用于向该文件写数据(输出)

  2. "w" 方式打开的文件只能用于向该文件写数据(输出),而不能用于从该文件读数据(输入)。如果该文件不存在,则在打开文件前建立一个以指定的名字命名的文件;如果该文件已存在,则在打开文件前将该文件删去,然后重新建立一个文件

  3. "a" 方式打开的文件用于向该文件末尾添加新的数据(不删除原有数据)。也就是说,打开文件时,文件读写标记移到文件末尾。若该文件不存在,则在打开文件前建立一个以指定的名字命名的文件

  4. "r+" "w+" "a+" 方式打开的文件既可以用来输入数据,也可以用来输出数据

  5. 二进制文件访问模式:在文本文件访问模式中加 "b"

    例如:"rb+" "wb+" "ab" rb+ "wb+" "ab+"

关闭文件

int fclose(FILE * fp)

fclose(fp);

写入后应关闭文件,否则有可能丢失数据

顺序读写文件

顺序读写 对数据读写顺序和数据在文件中的物理顺序一致

文本文件

fgetc 函数

int fgetc(FILE * fp)

fp指向的文件中读一个字符,如果成功则返回所读的字符,如果失败则返回文件结束标志EOF

fputc 函数

int fputc(int ch,FILE * fp)

把字符ch写到fp指向的文件中,如果成功则返回写入的字符,如果失败则返回文件结束标志EOF

//将文件数据逐字节复制到另一个文件
#include <stdio.h>
#include <stdlib.h>
int main() {
    FILE *in, *out;
    char  ch, infile[10], outfile[10];
    printf("Input file name:");
    scanf("%s", infile);
    printf("Output file name:");
    scanf("%s", outfile);
    if ((in = fopen(infile, "r")) == NULL)   {
        printf("Cannot open file\n"); exit(0); }
    if ((out = fopen(outfile, "w")) == NULL) {
        printf("Cannot open file\n"); exit(0); }
    while (!feof(in)) {
        ch = fgetc(in);
        if (ch == EOF) break;
        fputc(ch, out);
        putchar(ch);
    }
    putchar('\n');
    fclose(in);
    fclose(out);
    return 0;
}

fgets 函数

char* fgets(char* s,int n,FILE* fp)

从文件指针 fp 所指向的文件读入长度为 \(n-1\) 的字符串,并在最后加一个'\0'字符,然后存放到指针 s 所指向的内存空间中。读取失败返回 NULL

fputs 函数

int fputs(const char* s,FILE * fp)

将指针 s 指向的字符串写到文件指针 fp 所指向的文件中。成功返回 \(0\) ,否则返回非 \(0\)

fscanf 函数

int fscanf(FILE* fp,const char* format, 地址表列)

format 是格式字符串,如 fscanf(fp,"%d,%f",&i,&f);

fprintf 函数

int fprintf(FILE* fp,const char* format, 输出表列)

fprintf(fp,"%d,%f",i,f);

二进制文件

fread 函数

size_t fread(void* ptr,size_t size,size_t n,FILE* fp);

二进制方式读文件,从指针fp所指向的文件中读 n 块数据,每一块的大小为 size 字节,将这些数据存储到指针ptr所指向的内存空间中

fwrite 函数

size_t fwrite(const void* ptr,size_t size,size_t n,FILE* fp);

二进制方式读文件,从指针ptr所指向的内存空间中读 n 块数据,每一块的大小为 size 字节,将这些数据存储到指针fp所指向的文件中

#include <stdio.h>
#define SIZE 10
typedef struct {
    char name[10];
    int num;
    int age;
    char addr[15];
} Student;
void save(Student *s, int n) {
    FILE* fp; int i;
    if ((fp = fopen("data", "wb")) == NULL) {
        printf("cannot open file\n");return;}
    for (i = 0; i < n; i++)
        if (fwrite(&s[i], sizeof(Student), 1, fp) != 1)
            printf("file write error\n");
    fclose(fp);
}
int main()
{
    int i;
    Student s[SIZE];
    printf("enter student information: \n");
    for (i = 0; i < SIZE; i++)
        scanf("%s%d%d%s", s[i].name, &s[i].num,
              &s[i].age, s[i].addr);
    save(s, SIZE);
    return 0;
}

feof 函数

int feof(FILE* stream)

如果到达文件末尾,返回非零值,未到达返回 \(0\)

while(!feof(fp))
{
	fscanf(fp,"%d",&i);
    tot+=i;
}

随机读写文件

文件标记 用来指示接下来要读写的下一个字节的位置

rewind 函数

void rewind(FILE* fp);

使文件标记指向文件开头

fseek 函数

int fseek(FILE* fp,long offset,int whence);

使文件标记指向whence往前offset个字节(可以为负数,表示往后)的位置,其中whence的三个取值包括:0代表文件开始位置 ,1为当前位置,2为文件末尾位置

fseek (fp, 100L, 0); fseek (fp, 50L, 1);

#include <stdio.h>
#include <stdlib.h>
int main() {
    FILE* fp; char ch;
    if ((fp = fopen("test.txt", "w+")) == NULL) {
        printf("cannot open file\n"); exit(0);}
    fputs("this is a text file.", fp);
    rewind(fp);//== fseek(fp,0,0);
    while ((ch = fgetc(fp)) != EOF)
        putchar(ch);
    fclose(fp);
    return 0;
}

ftell 函数

long ftell(FILE* stream);

得到文件标记的当前位置,返回值是整数,表示相对于文件开头的偏移字节数,出错返回 \(-1\)

i = ftell(fp);
if(i==-1L)
    printf("error\n");

函数总结

功能 语法
打开关闭文件 fopen("test.txt","r"); fclose(fp);
读写字符 int fgetc(in); int fpotc(ch,out);
读写字符串 char* fgets(s,n,fp); int fputs(s,fp);
格式化读写 fscanf(fp,"%d%s",&n,a); fprintf(fp,"%s\n",a);
检测文件末尾 feof();
二进制读写 size_t fread(ptr,size,n,fp); size_t fwrite(ptr,size,n,fp);
随机读写 rewind(fp); fseek(fp,offset,whence) ftell(stream);
posted @ 2025-04-11 16:30  YamadaRyou  阅读(21)  评论(0)    收藏  举报