Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类9

  • 标签33

  • 归档211

  • 关于

  • 搜索

C语言中操作文件-随机读写数据文件(下)-学习笔记-66

发表于 2018-10-26 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

前面,我们知道了什么是文件位置标记,以及如何控制文件位置标记,学会了 rewind 和 fseek 这两个函数后,我们就来实现一下随机读写!

例子

输入10个学生成绩,然后存储到文件,接着读入文件,将1,3,5,7,9号学生数据输出到计算机上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
int main(){
struct Student{
int num;
char name[10];
float score;
}stu[10];
//输入数据
for (int i=0;i<10;i++){
scanf("%d %s %f",&stu[i].num,stu[i].name,&stu[i].score);
}
//存储数据
FILE *fp;
fp=fopen("/Users/liulin/1.txt","wb");
printf("存储的数据是:\n");
for(int i=0;i<10;i++){
fwrite(&stu[i],LEN,1,fp);
printf("第%d号%s的成绩是:%3.1f\n",stu[i].num,stu[i].name,stu[i].score);
}
fclose(fp);
//读入数据
printf("1、3、5、7、9的数据是:\n");
struct Student stu_in[10];
fp=fopen("/Users/liulin/1.txt","rb");
for(int i=0;i<10;i=i+2){
fseek(fp,i*LEN,0);
fread(&stu_in[i],LEN,1,fp);
printf("第%d号%s的成绩是:%3.1f\n",stu_in[i].num,stu_in[i].name,stu_in[i].score);
}
fclose(fp);
return 0;
}
阅读全文 »

C语言中操作文件-随机读写数据文件(上)-学习笔记-65

发表于 2018-10-26 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

我们之前讲的,都是对文件的顺序读写,很容易操作,但有时候效率不高。比如,文件中有1000个数据,我们如果需要找到第999号数据,那么需要从1遍历到998才可以。如果是一个城市几百万人的数据呢?所以随机访问应运而生,随机访问不是按数据在文件中的物理位置进行读写,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问高效的多。

文件位置标记

我们前面说过,w 方式打开是新建(有重名就删除再新建),文件标记在开头。a 方式打开是追加,文件标记在末尾。为了对读写进行控制,系统位每个文件设置了一个文件读写位置标记,简称(文件读写标记或文件标记),用来指示接下来要读写的下一个字符的位置。

文件位置读写标记

  • 顺序读文件:一般情况下,在对字符文件进行顺序读写的时候,文件位置标记指向文件开头,这时,如果对文件进行读的操作,然后文件位置标记向后移动一个位置,如果再一次执行读操作,就会将位置2的字符读入,以此类推(我们前面的例子也说过)直到文件尾。
    阅读全文 »

C语言中操作文件-用二进制的方式读写文件-学习笔记-64

发表于 2018-10-25 | 分类 笔记&教程 | 评论数: | 阅读次数:

引言

前面我们说,使用 fprintf 和 fscanf 确实很方便,也很好理解,但是频繁的进行读写,二进制和 ASCII 码转来转去不是事,太耽误时间了,那么今天我们就来学习如何读取和写入二进制数据,还能一次输入输出结构体等成组的数据哦~

二进制文件读写函数

一般形式

fread (buffer,size,count,fp);
fwrite(buffer,size,count,fp);

参数说明

  • buffer:是一个地址,对 fread 而言,buffer 代表着那些从文件读入的数据在内存存储区的地址。
  • size:要读写多少个字节数。
  • count:要读写多少个数据项,一个数据项的长度是 size 字节
  • fp:FILE 文件类型指针

我知道这里的 buffer、size 和 count 把大家绕晕了,我再来说明一下

1
2
3
float f[20];
fread(f,4,10,fp);
//从 fp 指向的文件中取出10个数据项,每项数据4个字节。存储到数组 f 中
阅读全文 »

C语言中操作文件-用格式化的方式读写文件-学习笔记-63

发表于 2018-10-25 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

我们前面将了如何输出一个字符、如何输出一串字符,但是数据并不仅仅只有字符,数据的类型是十分丰富的。我们在使用 printf 和 scanf 的时候,通过%d %s %f %o来格式化不同的数据,那么磁盘文件能否也这样进行操作呢?

格式化读写函数

其实就像 gets 、puts 和 fgets、fputs一样。
格式化读写函数是从 printf 、scanf 延伸

fprintf(文件指针,格式字符串,输出表列);
fscanf(文件指针,格式字符串,输入表列);

fprintf 函数:

1
2
3
4
int i=3;
float f=5.3;
fprintf(fp,"%d,%6.2f",i,f);
//将 int 型的 i 和 float 型的 f 按 %d 和 %6.2f 的形式输出到 fp 指向的文件中
阅读全文 »

C语言中操作文件-向文件读写一个字符串-学习笔记-62

发表于 2018-10-24 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

前面我们学习了如何向文件写入一个字符,以及读取一个字符串,但是这太反常识了,有没有方便读写一个字符串的方法呢?当然是有的!😎

读写字符串的函数

C 语言允许通过函数 fgets 和 fputs 一次读写一个字符串

函数名 调用形式 功能 返回值
fgets fgets(str,n,fp) 从 fp 指向的文件中,读取一个长度位 n-1 的字符串,存放到字符数组 str 中。 成功则返回str 的地址,失败则返回 NULL
fputs fputs(str,fp) 把 str 所指向的字符串写到文件指针变量 fp 中 成功为0,失败为非0

fgets 函数

一般形式

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

作用是从文件读入一个字符串到字符数组

1
2
fgets(str, n, fp);
//读取一个文件中的字符串给字符数组
阅读全文 »

C语言中操作文件-向文件写入字符-学习笔记-61

发表于 2018-10-24 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

前面,我们学会了如何打开一个文件,并创建一个指针指向该文件。打开之后,我们就要对文件进行读写了。

向文件读写字符

对文件进行读写一个字符,需要下面这两个函数

函数名 调用形式 功能 返回值
fgetc fgetc(fp) 从 fp 指向的文件读入一个字符 读入成功,返回所读的字符 读入失败,返回-1
fputc fputc(fp) 把字符 ch 写到文件指针变量 fp 指向的文件 输出成功,返回输出的字符 输出失败,返回-1

fgetc 中

  • f: 表示 file 即文件
  • get:表示 获取
  • c:表示 character
  • fputc 同理

例子引入

从键盘逐个输入字符串,然后用 fputc 函数写到磁盘文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include<stdlib.h>
int main(){
FILE *fp;
char ch,filename[20]; //一个存文字,一个存文件目的
printf("请输入文件位置:\n");
scanf("%s",filename); //输入文件名
if((fp=fopen(filename,'w'))==NULL){
// 如果获取不到指针,就证明打开文件失败
printf("错误!文件无法读入!");
exit(0); //结束该程序
}
ch=getchar(); //因为上面输入文件名的时候,输入了一个回车,先存在这里,否则会输入到磁盘里
printf("请输入一个准备存储到磁盘的字符串(#号结尾):\n");
ch=getchar(); //覆盖上面的回车,获取输入的第一个字符
while(ch!='#'){
//如果第一个字符不是 # 号,就开始循环
fputc(ch,fp); //因为上面已经输入了一个了,所以先存储
putchar(ch); //然后把输入的内容输出到终端
ch=getchar(); //再从键盘获取新的输入的内容
}
fclose(fp); //用完文件一定要关闭文件,否则写入会失败
return 0;
}
阅读全文 »

C语言中操作文件-打开和关闭数据文件-学习笔记-60

发表于 2018-10-23 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

我们讲了这么久的文件,知道了文件名、内存缓冲区、缓冲区中的文件信息区以及定义一个 FILE 结构体变量和指针。今天我们就来尝试打开和关闭一个文件。

fopen 函数打开文件

ANSI C 规定了用标准输入输出函数 fopen 来实现打开文件
一般形式

fopen (文件名 , 使用文件方式);

例如:

1
2
fopen("a1","r");
//其中 a1 就是文件名,r 就是使用文件方式

a1:是要打开的文件名,也可以是字符数组的首地址
r:使用文件方式(r 表示 read 读入)

fopen 函数的返回值是指向 a1 文件的指针,也就是 a1 在内存中的文件信息区的起始地址。所以,我们经常将 fopen 函数的返回值给一个指向文件的指针变量。

1
2
FILE *fp;  //定一个指向文件的指针变量 fp
fp=fopen("a1","r"); //将 fp 赋值,值为a1的文件信息区起始地址
阅读全文 »

C语言中操作文件-文件类型指针-学习笔记-59

发表于 2018-10-23 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

在上节讲的缓冲文件系统中,最关键的概念就是文件类型指针,简称为:文件指针。我们知道,要让程序操作一个文件,都需要将其加载到内存中,但是加载到内存之前,需要现经过缓冲区。所以,每个文件被使用时,都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息。

有关信息包括:文件名、文件状态及文件当前位置等信息

这些信息都是保存在一个结构体变量中的,该结构体类型由系统声明,取名为FILE。

存放文件信息的 FILE

在不同的 C 编译环境中 FILE 的内容可能不完全相同,我们来举个例子,FLIE 的结构体可能是这样的,它包含在stdio.h中:

1
2
3
4
5
6
7
8
9
10
11
typedef struct {
short level; // 缓冲区“满”或“空”的程度
unsigned flags; //文件状态标志
char fd; //文件描述符
unsigned char hold; //如缓冲区无内容不读取字符
short bsize; //缓冲区的大小
unsigned char * buffer; //数据缓冲区的位置
unsigned char* curp; //指针当前的指向
unsigned is temp; //临时文件指示器
short token; //用于有效性检查
}FILE;
阅读全文 »

C语言中操作文件-文件分类和文件缓冲区-学习笔记-58

发表于 2018-10-22 | 分类 笔记&教程 | 评论数: | 阅读次数:

文件的分类

根据数据的组织形式不同,数据文件可以分为:

  • ASCII 文件
  • 二进制文件

数据在内存中是以二进制形式存储的。
如果不加转换,输出到外存,就是二进制文件,
可以认为它是存储在内存的数据的影响,也称之为映像文件。

如果要求在外存上以 ASCII 码的形式存储,需要在存储前将二进制文件转换成 ASCII 文件,又称文本文件,每一个字节存放一个字符的 ASKII 码。

数据在磁盘入怎样存储?

字符:一律以 ASCII 码形式存储。
数值:即可以以 ASCII 码形式存储,也可以以二进制存储。

存储整数 10000
ASKII 码:5个字节(每个字符占 1 字节)
二进制:4个字节

阅读全文 »

C语言中操作文件-文件和文件名-学习笔记-57

发表于 2018-10-22 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

只要是会使用计算机的人,对文件一定都不陌生,word 文件、PPT 文件、邮件的附件、照片、视频都是文件。要在程序中操作这些文件,就需要对文件的基础进行了解。

文件是什么

文件有不同的类型,在程序设计中,主要用到两种文件

  • 程序文件: 包括源程序.c文件、目标文件.obj文件以及可执行文件.exe 文件等。这种文件的内容是程序代码。
  • 数据文件: 这种文件的内容不是程序,是供程序运行时读写的数据。包括在程序运行过程中输出到磁盘的数据、供程序读入的数据。如成绩数据或者货物交易记录等。

本章我们主要讨论的是第二种,数据文件。

阅读全文 »

1…789…22
Bliner

Bliner

211 日志
9 分类
33 标签
RSS
推荐阅读
  • 关于GTD中项目“复盘”的一些看法
0%
© 2019 Bliner |
主题 — NexT.Pisces
|
鲁ICP备13021673号
访问人数 总访问量 次