Bliner'Site Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类 10

  • 标签 36

  • 归档 214

  • 关于我

  • 搜索

分类:笔记&教程

C语言中操作文件-文件读写的出错检测-学习笔记-67

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

引入

我们在使用输入输出函数的时候,可能会出现错误。所以 C 语言提供了一些函数,帮助我们检测这些错误!

ferror 函数

之前,我们总是根据输入输出函数的返回值来判断函数是否执行,成功。现在我们还可以使用 ferror 函数进行检查。

一般形式

ferror(fp);

返回值

如果返回值为 0 (假):表示未出错
如果返回值为非0:表示出错

注意,对同一个文件来说,每一次调用输入输出函数,都会产生一个新的 ferror 函数值,所以,应该在调用一个输入输出函数后立即检查 ferror 函数的值。

阅读全文 »

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

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

引入

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

例子

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

#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 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 23

引入

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

文件位置标记

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

文件位置读写标记

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

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

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

引言

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

二进制文件读写函数

一般形式

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

参数说明

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

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

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

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

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

引入

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

格式化读写函数

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

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

fprintf 函数:

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 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 72

引入

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

读写字符串的函数

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);

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

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

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

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

引入

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

向文件读写字符

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

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

fgetc 中

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

例子引入

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

#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 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 52

引入

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

fopen 函数打开文件

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

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

例如:

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

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

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

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

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

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

引入

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

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

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

存放文件信息的 FILE

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

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 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 38

文件的分类

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

  • ASCII 文件
  • 二进制文件

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

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

数据在磁盘入怎样存储?

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

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

阅读全文 »
上一页 1 ... 7 8 9 ... 14 下一页
Bliner

Bliner

214 日志 10 分类 36 标签
RSS

推荐阅读

关于GTD中项目“复盘”的一想法
© 2008 - 2026 Bliner
鲁ICP备13021673号