当前位置:   article > 正文

文件操作:打开、关闭、读取、定位_c:\\users\\lenovo\\desktop

c:\\users\\lenovo\\desktop

文件的分类:文本文件、二进制文件

        文本文件中,保存的时候一个字符对应一个字节;

        二进制文件,按照二进制编码保存的文件。

  • fopen/fclose函数
  • 从文件中读出
    • fgets 函数
    • fread函数
  • 写入文件
    • fputc函数
    • fwrite函数
  • rewind函数
  • fseek 函数

用 vs 或者 Dev-C++ 使用 fopen等函数时,如果遇到打开不了的情况,例如:

可以在预定义时,在头文件前加上:#define _CRT_SECURE_NO_WARNINGS

fopen/fclose函数

fopen 函数打开文件,执行操作。

文件一旦使用完毕,应该用 fclose 函数把文件关闭,以释放相关资源,避免数据丢失。

不了解函数时,用鼠标点击该函数,按 Fn 键+ F1键。

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

语法(filename  文件名、mode  类型)

文件打开:

	FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "r");

 验证是否打开:

  1. if (fp == NULL)
  2. printf("打开失败");

 如果 filename 或 mode 是 NULL 或空字符串,这些函数则会触发无效的参数处理程序,如 Parameter Validation。 如果允许执行继续,则这些函数将返回 NUll 并将 errno 设置为EINVAL。 

 二进制读写:rb、wb、ab、rb+、wb+、ab+. 与上文对应(只不过适用于二进制文件)。

 从文件中读出

  1. //一个一个输出
  2. char ch=0;
  3. if (fp != 0)
  4. {
  5. ch=fgetc(fp);
  6. printf("%c",ch);
  7. ch=fgetc(fp);
  8. printf("%c",ch);
  9. }
  1. //循环全部输出
  2. while (fp!=0&&EOF!=(ch = fgetc(fp)))
  3. {
  4. printf("%c", ch);
  5. }

 fgets 函数

从指定的流中读取数据,每次读取一行。

char *fgets(char *str,int n,FILE *stream);

  1. //输出文件的第一行,接着输出第二行,同理输出第三行
  2. char str[200];
  3. if (fp != 0)
  4. {
  5. fgets(str, 200, fp);
  6. printf("%s\n", ch);
  7. fgets(str, 200, fp);
  8. printf("%s\n", 200, fp);
  9. }
  1. char str[200];
  2. //循环输出每一行
  3. while (fgets(str, 100, fp))
  4. {
  5. printf("%s", str);
  6. }

fread函数(一般读取二进制文件)

从开头读起,读取结束时,文件指针会自动移动到读取结束的地方。

语法 (buffer   数据的存储位置 / size  项目大小,以字节为单位 / count   要读取的项的最大数量 / stream   指向 FILE 结构的指针)

  1. //返回实际读取的大小
  2. char str[200]={0};
  3. int n = fread(str, 1, 20, fp);
  4. str[n] = '\0';
  5. printf("%s\n", str);
  1. //按字符个数输入,如果文件里面没有空格,循环结束
  2. char str[100] = { 0 };
  3. while (fread(str, 1, 100, fp))
  4. {
  5. printf("%s", str);
  6. }

写入文件

	FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "w");

fputc函数——写入字符串

语法( c   要写入的字符 / stream   指向 FILE 结构的指针) 

  1. //写一个字符,清空之后写
  2. FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "w");
  3. fputc( 'A',fp );
  4. fputc('B', fp);
  5. fputc('C', fp);
  1. char str[] = "sddguerghieruuuuuufhdkhvkshgr";
  2. fputs(str, fp);
  3. fputs(str, fp);
  4. fclose(fp);

fwrite函数

语法( butter   指向要写入的数据的指针/ size   项大小,以字节为单位 / count   要写入的项的最大数量 / stream   指向 FILE 结构的指针)

  1. int num = 456123;
  2. fwrite(&num, sizeof(num), 1, fp);

也可以定义结构体,这样用:

  1. struct node
  2. {
  3. char name[10];
  4. char sex[10];
  5. };
  1. struct node p = { "张三","男" };
  2. fwrite(&p, 1, sizeof(p), fp);

如果要读写内容的话,可以在打开文件时使用 w+ 或者 r+,但是读完数据之后,不能直接写出来,因为文件的指针(光标)在最后面,此时是写不出来的。

那么就需要重置指针到文件开头,用 rewind 函数。

rewind函数——重置文件指针到文件头

例:

  1. FILE* fp = fopen("C:\\Users\\Lenovo\\Desktop\\list.txt", "w+");
  2. //存入并输出A-Z
  3. for(int i=0;i<26;i++)
  4. {
  5. int ret=fputc('A'+i,fp);
  6. printf("%c",ret);
  7. }
  8. printf("\n");
  9. //接下来接着读取
  10. int ch=fgetc(fp);
  11. printf("%c",ch);
  12. fclose(fp);

按照这个代码的思路是:第一步输出二十六个字母之后,换行,接着第二步读取文件的值,但是第二步没有实现,因为在执行完第一个操作后,文件的指针在最后,再往后走是读不到字符的,此时用 rewind 函数,重置指针,就可以接着从文件头开始读取了。

只需要改一个地方,在第二步开始之前加入:

	rewind(fp);

 fseek 函数

是一个非常方便的文件读取函数,可以设置文件指针到指定位置。

语法( stream   指向 FILE 结构的指针 / offset   origin 中的字节数 / origin   初始位置)

 可以将文件开头数的第十位字符输出

  1. char str[200] = { 0 };
  2. fseek(fp, 10, SEEK_SET);//开头开始读
  3. fread(str, 1, 100, fp);
  4. printf("%s\n", str);

从指针当前位置倒退十个字符

  1. char str[100] = { 0 };//初始化
  2. fseek(fp, -10, SEEK_CUR);
  3. fread(str, 1, 100, fp);
  4. printf("%s\n", str);

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号