c语言学习笔记2--文件操作

life is cat,coffee,and create


前言

始终觉得,听懂只是了解,能讲述才是掌握

一篇文章带你搞定c语言文件操作,应付考试没问题√

一、文件的存储

文件地址大家应该很熟悉了,但也丢个图以表示教程的完整-w-

需要注意到的是,数据文件在内存中的存储形式有两种,分别是ASCⅡ文件与二进制形式文件,这在之后会用到。

二、C中对文件操作的基本示例

1.最简单的示例

再多嘴一句,这个教程是最最最基本的文件操作~

先来看一个最基本的示例

void main()
{
    FILE* f;
    f = fopen("reademe.txt", "wb");
    fflush(f);
    fclose(f);
    return;
}

简单说明下。首先获取了文件指针,然后将指针通过fopen函数进行文件地址的获取,并且指定操作模式“wb”,同时打开文件;fflush是用来清理缓存的,具体作用可以不用管,但在大型项目中需要小心使用,具体用法可以参考别的文章,这里就记住在关闭文件前fflush一下是个好习惯就行。然后fclose,显而易见,就是关闭文件,虽然不关闭随着程序的结束也会自动关闭,但为了完整还是建议加上。

然后你把代码复制了,运行发现...编译不通过!

这个问题很常见了,是新旧版本c语言自带库函数变更导致的,当然有很多种方法解决,这里给出最简单的方法:在程序最上面加上这句...

#define _CRT_SECURE_NO_DEPRECATE

然后运行,编译通过,发现我们的文件目录下多了这个 

reademe,txt 这是因为我们在打开文件时没有在同目录下找到这个文件,于是自动帮我们创建了

当然我们也可以在不同目录下试一试

f = fopen("E:/C语言/ct-1/reademe.txt", "wb");

运行,发现在该目录下出现reademe

 

如果我们不用旧版函数,用提示中建议使用的 fopen_s呢?很明显,所需的参数不同,应改成如下

void main()
{
    FILE* f;
    errno_t err;
    err = fopen_s(&f,"E:/C语言/ct-1/reademe.txt", "wb");
    fflush(f);
    fclose(f);
    return;
}

简单说下这里。fopen返回的是一个文件指针,所以直接赋值拿来用;而fopen_s返回的是一个值,打开文件成功返回0,失败返回非0。在参数中传入了要赋值的指针,并直接访问其地址。、

这就是最简单应用。同理之后也会涉及到有些函数的不安全问题,这里只就旧版函数进行讨论

三、常用的一些文件操作函数

1.fopen()

fopen()这个函数接收两个参数,

 分别是文件名,操作模式。用一个文件指针接受。

FILE* f;
    f = fopen("reademe.txt", "mode");

操作模式如下:

 注意这里提到的输入指的是往内存里输入,或者说是程序里,输出是指往磁盘里输出。

2.fprintf()与 fscanf()

这两个其实是对于文件的格式化输入与读取,

这个函数用于往打开的文件里面写入数据。如下示例:

 分别是文件指针,输入格式,以及输入的东西。

void main()
{
    FILE* f;
    f = fopen("E:/C语言/ct-1/reademe.txt", "wb");
    fprintf(f, "%s", "hellowfiles");
    fflush(f);
    fclose(f);
    return;
}

运行后

fscanf()

 看这个例子

void main()
{
    FILE* f;
  
    f = fopen("E:/C语言/ct-1/reademe.txt", "w+");
    fputs("Life is cat and code",f);
    
    char str1[10], str2[10], str3[10], str4[10], str5[10];
    //rewind(f);
    fscanf(f,"%s %s %s %s %s", str1, str2, str3, str4, str5);
    printf("1:%s\n", str1);
    printf("2:%s\n", str2);
    printf("3:%s\n", str3);
    printf("4:%s\n", str4);
    printf("5:%s\n", str5);
   
    fflush(f);
    fclose(f);
    return;
}

这个例子中,我们在文件中写入了一句话,然后以格式化的形式进行了输出。然鹅你复制了...又不对!这个问题在于随着写入,文件内部的指针移动了最后,这时我们再想从头读取肯定是不对的,我们需要对这个指针进行移动。只需要把上面代码里面藏得小注释该回去就行啦!有关rewind()这个我们后面说到文件内指针的时候再讲。

运行后:

3.fputc()与fgetc()

这俩函数是读写一个字符的函数

先说fputc() 

举个例子

void main()
{
    FILE* f;
    f = fopen("E:/C语言/ct-1/reademe.txt", "w");
  
    char c = getchar();
    while (c != '#')
    {
        fputc(c, f);
        putchar(c);
        c = getchar();
    }

    fflush(f);
    fclose(f);
    return;
}

 这个例子可以让我们随意往文件里输入字符,直到出现#。这里就可以很明显的理解fputc和putchar的区别,一个是往文件里丢,一个是往命令行上丢。

再来说fgetc()

void main()
{
    FILE* f;
    f = fopen("E:/C语言/ct-1/reademe.txt", "r");
  
    
    while ( !(feof(f)))
    {
        char ch = fgetc(f);
        putchar(ch);
        
    }

    fflush(f);
    fclose(f);
    return;
}

这个例子里,我们对上面写入的redeme进行了读取,并且打印在命令行上。也就是说fgetc()能将该文件里的数据一个一个一个的读取。

这里我们还用到了feof()这个函数,是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0

4. fgets()与fputs()

这俩函数是读写一个 字符串的函数

5.写入与读取二进制文件

使用fwrite()与 fread()写入与读取二进制文件

void main()
{
    FILE* f;
    f = fopen("test.data", "w+");
    int i = 12;
    fwrite(&i, sizeof(int), 1,f);
  
    fflush(f);
    fclose(f);

    i = 1000;
    f = fopen("test.data", "r");
    fread(&i, sizeof(int), 1, f);
    printf("i = %d\n", i);
    fflush(f);
    fclose(f);
    return;
}

第一个参数是指向要被写入的元素数组的指针; 第二个要被写入的每个元素的大小,以字节为单位;第三个是元素的个数,每个元素的大小为 size 字节;第四个是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。

6. 任意顺序的操作

首先要清楚,这里说的数据文件都是txt的文本格式,可以抽象的理解为当我们访问时会有一个文件指针:


 每个方格里都会存放一个字符

这个指针其实就是我们一开始

FILE* f;
  f = fopen("test.data", "w+");

所生成的指针,这个指针一开始会在文件头的位置。

我们有fseek()来对文件指针进行操作

 举个菜鸟教程上的栗子:

#include <stdio.h>

int main ()
{
   FILE *fp;

   fp = fopen("file.txt","w+");
   fputs("This is runoob.com", fp);
  
   fseek( fp, 7, SEEK_SET );
   fputs(" C Programming Langauge", fp);
   fclose(fp);
   
   return(0);
}

This is C Programming Langauge

这里面使用了常量,对照表如下:

总结

okk,以上就是关于文件的基本操作内容了,跟着敲一遍掌握应该是没问题的~

都是一些最最基础的应用希望能对你有所帮助

✪ ω ✪

猜你喜欢

转载自blog.csdn.net/Gelercat/article/details/125165949