THE C PROGRAMMING LANGUAGE

Slides:



Advertisements
Similar presentations
Loops.
Advertisements

補充: Input from a text file
雷 霆 战 机 By—谷恩轩&余万全.
第 5 章 文件I/O操作.
C程序设计 第10章 文 件 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
第十三章 文件.
第九章 系 统 安 全 性 9.1 结构体 9.2 结构体型数组  9.3 结构体型指针 9.4 内存的动态分配 9.5 共用体
複習 struct score_Type{ int chinese,english; }; struct my_Type{
C语言程序设计 第十二章 位运算.
C File System.
高级语言程序设计 主讲人:陈玉华.
C 程序设计实例 1. 问题描述 2. 数据结构 3. 算法分析 4. 参考程序 5. 改进说明.
计算概论 第二十一讲 文件操作 北京大学信息学院.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
If … else 選擇結構 P27.
第10章 文件操作.
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n:
STRUCTURE 授課:ANT 日期:2010/5/12.
计算概论 第十八讲 C语言高级编程 结构与习题课 北京大学信息学院.
第10章 文件操作.
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
C 語言簡介 - 2.
Chap 8 指针 8.1 寻找保险箱密码 8.2 角色互换 8.3 冒泡排序 8.4 电码加密 8.5 任意个整数求和*
程序设计专题一 结构化程序设计与递归函数 主讲教师: 刘新国.
11.1 文件的基本概念 11.2 文件的打开与关闭 11.3 文件的顺序读写 11.4 文件的随机读写 11.5 文件检测
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第五章 指针 5.1 指针的概念和定义 5.2 指针运算 5.3 指针和数组 5.4 字符串指针 5.5 指针数组 5.6 指向指针的指针
第十二章 文件 12.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质:
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
1. 說明一個一維整數陣列passwd,下標範圍0至49 2. 在屏幕顯示 "Enter password"
fp=fopen("CD2.dat","wb"); fwrite(&min,8,1,fp); fclose(fp);
第4章 MATLAB文件操作 4.1 文件的打开与关闭 4.2 文件的读写操作 4.3 数据文件定位.
檔案 將資料存入磁碟或由磁碟取出資料的方式, 稱為檔案存取處理。 C語言的檔案處理 C++語言的檔案處理.
程式設計 博碩文化出版發行.
第九章 文件 程序数据标准输入输出设备 程序数据文件 数据流和文件 文件的打开和关闭 文件读写函数.
File(檔案處理) 學習目標:開檔、讀檔、更新檔與關閉檔案.
第10章 文件操作.
字符串和字符数组 字符串的输入和输出 字符串的基本操作
第10章 檔案與資料夾處理 10-1 C語言的檔案輸入與輸出 10-2 文字檔案的讀寫 10-3 二進位檔案的讀寫
第5章 文件.
第9章 文件操作 文件 使用文件的目的 操作系统管理数据的基本单位 存储在外存储器上的数据的集合
第三章 数据类型、运算符与表达式.
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
研讨课4 文件操作.
第4章 顺序程序设计.
PHP5與MySQL4 入門學習指南 凱文瑞克 著 第 16 章 檔案處理.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
一、文件的基本概念 第十三章 文 件 所谓“文件”是指一组相关数据的有序集合。 这个数据集有一
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
第3章 變數、算術運算、 數學函數及輸入輸出.
實習十 開讀檔練習.
C標準輸出入函數庫 與 作業系統.
C语言程序设计 李祥 QQ:
本节内容 文件读写 视频提供:昆山爱达人信息技术有限公司.
第2章 基本数据及其运算 本章学习的目标: 1、掌握基本数据的各种表示,基本数据常数的书写方法;
第二章 类型、对象、运算符和表达式.
第二章 基本数据类型 ——数据的表示.
第13章 文 件.
Introduction to the C Programming Language
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
結構、檔案處理(Structure, File)
第十二章 位运算.
第七章 文件 7.1 文件的基本概念 7.2 文件类型指针 7.3 文件的打开与关闭 7.4 文件的读/写 7.5 文件的随机读/写
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab2.
C语言程序设计 第13章 文件操作.
陣列與檔案處理 授課:張朝麟 日期:2009/3/11.
Presentation transcript:

THE C PROGRAMMING LANGUAGE 计算中心- NEU Computer Center 高克宁-gaokening E_mail:chengxusheji01@necmail.neu.edu.cn

0.本章内容 文件概述 文件的打开与关闭 文件的顺序读写 文件的定位与随机读写

1.文件概述 什么是文件? 文件指存储在外部介质上的数据的集合 例如 磁盘上的每个文件都有唯一的名字,进行标识,依据文件名找到相应的文件 程序文件中保存着源程序 数据文件中保存着数据 声音文件中保存着声音数据 磁盘上的每个文件都有唯一的名字,进行标识,依据文件名找到相应的文件

1.文件概述 什么是文件? 操作系统是以文件为单位对数据进行管理的 如果想使用存在外部介质上的数据,必须先按文件名找到指定的文件,然后再从文件中读取数据 如果要向外部介质上存储数据, 也必须先建立一个文件, 再向它输出数据。 文件除了包括磁盘上存储的内容外, 从操作系统的角度看与主机相连的各种输入输出设备也是文件。 例如, 键盘是输入文件, 显示器是输出文件

1.文件概述 为什么要使用文件? 优点 C语言如何实现文件操作? 文件的改动不能引起程序的改动 不同的程序可以访问同一数据文件中的数据 即程序与数据分离 不同的程序可以访问同一数据文件中的数据 即数据共享 能够长期保存程序运行的中间数据或结果数据 C语言如何实现文件操作? 通过操作系统完成对文件的输入输出操作 通过由C语言的编译系统提供的一套用于文件操作的库函数,也称为“标准输入/输出库”

1.文件概述 文件的分类 C语言把文件看作是一个字节的序列 文本文件(又称ASCII文件) 即文件是由一个一个字节的数据顺序组成的 根据数据的组织形式把文件分为两类:文本文件和二进制文件。 文本文件(又称ASCII文件) 文件的每一个字节存放一个ASCII码, 代表一个字符 优点 ASCII码文件较为直观、可读性好 便于对字符进行处理 可以直接在DOS下的用type命令或Windows下的记事本等工具直接观察 缺点 占用存储空间较多, 二进制形式与ASCII码形式转换需要时间

1.文件概述 文件的分类 二进制文件 把内存中的数据按其在在内存中的存储形式原样输出到磁盘上存放。 优点 输入输出时不需要进行转换 节省磁盘空间和转换时间 缺点 不能直接输出字符形式 不能直接识别内存中的表示形式,不方便人们的阅读和理解,可读性差

1.文件概述 文件的分类 设内存有一整数2460, 内存中的存储形式: 0000 1001 1001 1100 2460在文本文件中的存储形式: 0011 0010 0011 0100 0011 0110 0011 0000 2460在二进制文件中的存储形式: 0000 1001 1001 1100

2.磁盘文件系统 磁盘文件系统对文件的处理方法 读文件 写文件 使用缓冲区的目的是为了减少对磁盘的实际读写次数 从磁盘文件输入数据时(即读文件), 先将数据送到“输入缓冲区”, 再从缓冲区将数据传送给程序数据区(即传给程序中的变量) ; 写文件 向磁盘文件输出数据时(即写文件), 先将程序中变量的值送到“输出缓冲区”, 等缓冲区装满后再将数据一起传送给磁盘文件。 使用缓冲区的目的是为了减少对磁盘的实际读写次数

2.磁盘文件系统 磁盘文件系统对文件的处理方法 程 序 数 文件 据 区 输入文件缓冲区 输出文件缓冲区 计算机内存 输入 读文件 输出 外存 文件 写文件 输出 输入 读文件

2.磁盘文件系统 磁盘文件系统的分类 缓冲文件系统 非缓冲文件系统 系统自动的在内存区为每一个正在使用的文件开辟一个缓冲区 缓冲区的大小由具体的C版本确定, 一般为512字节。 非缓冲文件系统 系统不会自动开辟缓冲区 由程序为每个文件设定缓冲区及其大小(即缓冲区由用户根据需要自己进行设置)

2.文件类型指针 概念 要读取一个文件需要有一定的信息 对已打开文件进行操作,都要通过指向该文件结构的指针进行 如文件当前的读写位置, 与文件对应的内存缓冲区地址, 文件的操作方式等,这些信息都存放在“文件信息区”中 “文件信息区”是一个结构体变量 , 其结构体类型由系统定义, 类型名为 FILE 在头文件stdio.h中定义的结构FILE 对已打开文件进行操作,都要通过指向该文件结构的指针进行 typedef struct { short level; /*文件的缓冲区级别(满或空的程度)*/ unsigned flag; /*文件状态标志*/ char fd; /*文件号*/ int cleft; /*缓冲区的剩余字符(剩余空间)*/ int mode; /*文件的操作模式*/ short size; /*缓冲区大小*/ char *buffer; /*文件缓冲区的地址(位置)*/ char *curp; /*当前地址指针(下一个字符的位置)*/ short token; /*有效性检查控制单元*/ }FILE;

2.文件类型指针 定义形式 文件的操作 FILE * 指针变量名 ; 说明 C语言中文件的操作主要是由C语言库函数实现 只有通过文件指针变量才能调用相应的文件 有n个文件就要定义n个文件指针变量, 分别对应各个文件 FILE必须大写 文件的操作 C语言中文件的操作主要是由C语言库函数实现 文件操作的函数属于标准输入输出库中的函数 需在程序中使用预处理命令 #include <stdio.h>

2.文件的打开与关闭 文件的打开 fopen函数 格式: fopen ( 文件名 , 文件使用方式 ) ; 说明 需要打开的文件名 例 FILE *fp ; fp = fopen ( “file1” , “r” ) ; 使用文件的方式(读或写) 让哪个指针变量指向被打开的文件

2.文件的打开与关闭 文件的打开 使用文件的方式 “r”与“rb” 只读 “w”与“wb” 只写 以此方式打开文件时, 该文件必须已经存在, 如不存在将出错. 打开文件后只能从文件中读数据, 当前读写位置设定于文件开头 “w”与“wb” 只写 以此方式打开文件时, 如有同名文件(即文件已存在), 则将原有文件内容删除并写入新内容; 如没有同名文件(即文件不存在), 则建立一 个新文件. 打开文件后只能向文件中写数据, 当前读写位置设定于文件开头

2.文件的打开与关闭 文件的打开 使用文件的方式 “a”与“ab” 追加 带“+”号的形式: 表示即能读又能写 以此方式打开文件时, 如有同名文件, 则将当前读写位置设定于文件末尾, 可以追加数据; 如无同名文件, 则建立一个新文件 带“+”号的形式: 表示即能读又能写

2.文件的打开与关闭 文件的打开 打开文件的方法 打开文件时 , 因使用方式不对或其他原因, 可能会使打开文件的操作失败 , 这时fopen函数的返回值是NULL, 所以在打开文件时通常会做一个判断 , 看打开操作是否成功。 例 if ( ( fp =fopen(“file1”, “r”) ) = = NULL ) { printf(“Can not open this file!\n”) ; exit( 0 ) ; } 说明: exit 函数的作用是关闭所有文件, 结束程序, 并返回 操作系统, 也可写成 exit ( ) ; 注意: 使用exit函数要包含头文件 < stdlib.h >

2.文件的打开与关闭 【例】以写方式打开一个readme.txt文件。 #include “stdio.h” void main() { FILE *fp; fp=fopen(“readme.txt”,“w”); if(fp=NULL) printf(“file not found!”); fclose(fp); } else printf(“file opened ok!”); 可以在fopen打开文件时 检查函数的返回值是否 为NULL以确定文件是否 真正打开,若文件打开 失败,还使用读写函数 对文件进行读写操作将 会出现错误。

2.文件的打开与关闭 也可以写成下面这种方式: #include “stdio.h” void main() { FILE *fp; fp=fopen(“readme.txt”,“w”); if (fp=NULL) printf(“file not found!”); exit(0); } else printf(“file opened ok!”); /*exit(0)是一个库函数,定义在“stdio.h”中,它起的作用是: (1)关闭所有文件; (2)程序正常退出; (3)返回操作系统; (4)将(0)返回操作系统。

2.文件的打开与关闭 文件的关闭 fclose函数 格式:fclose ( 文件指针变量 ) ; 说明: 作用 将文件指针变量所指向的文件关闭, 即使文件指针变量不再指向该文件,以后不能通过文件指针变量对该文件进行操作 例: fclose( fp ) ;

2.文件的打开与关闭 文件的关闭 关闭文件的重要性 写文件时, 在“输出缓冲区”装满后, 才将数据一起写入文件。 当程序结束时, 缓冲区可能还未满, 如未关闭文件就结束程序, 则缓冲区的数据不能写入文件, 会丢失数据。 使用fclose函数, 不论缓冲区是否已满, 都会将缓冲区的数据写入文件, 再关闭文件。

将字符‘s’写入fp指向的文件file1中 3.文件的顺序读写 输入/输出一个字符 fputc函数(向文件输出一个字符) 格式:fputc ( 字符常量或字符变量 , 文件指针变量 ) ; 说明 函数返回值:成功时返回该字符 , 失败时返回 EOF 作用 将一个字符写到文件指针所指向的文件中去 例: FILE *fp ; char ch ; if ( ( fp =fopen(“file1”, “w”) ) = = NULL ) { printf(“Can not open this file!\n”) ; exit( 0 ) ; } fputc( ‘s’ , fp ) ; ch = getchar( ) ; fputc( ch , fp ) ; 将字符‘s’写入fp指向的文件file1中 将字符变量ch中存放的字符 写入fp指向的文件file1中

3.文件的顺序读写 输入/输出一个字符 fgetc函数 形式: 字符变量 = fgetc( 文件指针变量 ) ; 作用 说明 函数返回值: 成功时返回该字符 , 失败时返回 EOF 作用 从文件指针变量所指向的文件中读一个字符 , 并将它赋给程序中的一个字符变量 注意: EOF 实际是一个符号常量 , 其值为 –1。一般用EOF作字符文件的文件结束符 , 当用 fgetc函数时, 如果遇到文件结束也将返回 EOF 例: FILE *fp ; char ch ; if ( ( fp =fopen(“file1”, “r”) ) = = NULL ) { printf(“Can not open this file!\n”) ; exit( 0 ) ; } ch = fgetc ( fp ) ; printf(“%c” , ch ) ;

3.文件的顺序读写 输入/输出一个字符串 fgets函数 格式: fgets( str , n , fp ) ; 作用 说明 函数返回值: 成功返回str数组的首地址 , 失败返回 NULL 作用 从fp所指向的文件中读(n-1)个字符 , 将它们存放到str数组中, 并在其后自动加一个‘\0’, 如果读入(n-1)个字符前遇到换行符或文件结束符EOF, 则结束读入。

3.文件的顺序读写 输入/输出一个字符串 fputs函数 格式:fputs( str , fp ) ; 作用 说明 函数返回值: 成功返回 0 , 出错返回 非 0 值 作用 将str字符串写到fp所指向的文件中, 但‘\0’不写入文件

3.文件的顺序读写 输入/输出一个字符串 例题 从键盘输入一行字符, 以‘!’结束, 将这 行字符中的小写字母改为大写字母, 然后保存到磁盘文件“test.txt”中 输入/输出一个字符串 例题 #include <stdio.h> #include <stdlib.h> void main( ) { FILE *fp; char str1[20] , str2[20]; int i=0; if ( ( fp =fopen(“test.txt”, “w”) ) = = NULL ) { printf(“can not open this file!\n”); exit( 0 ); } gets(str1); while ( str1[i]!=‘!’ ) { if ( str1[i]>=‘a’ && str1[i]<=‘z’ ) str1[i]=str1[i]-32; fputc( str1[i] , fp); i++ ; } fclose(fp); fp=fopen( “test.txt” , “r” ); fgets(str2 , i+1 , fp ); puts(str1); puts(str2); }

3.文件的顺序读写 按“数据块”的方式输入输出 格式 fread ( buffer , size , count , fp ) ; fwrite ( buffer , size , count , fp ) ; 说明 buffer : 是一个地址 对fread而言 buffer是从文件中读取的数据要存放的存储区的首地址,对fwrite, buffer是向文件中写入数据时存储变量的地址 size : 要读写数据所占用的字节数 count : 要读写数据项的个数 fp : 文件指针变量 注意 用 fread , fwrite 必须采用二进制方式打开文件

3.文件的顺序读写 按“数据块”的方式输入输出 例题 #include <stdio.h> 从键盘输入10个整数,把它们 保存到文件“datafile.txt”中, 再从文件中读取这些整数, 并 输出到显示器上。 按“数据块”的方式输入输出 例题 #include <stdio.h> #include <stdlib.h> void main ( ) { FILE *fp ; int m , n , j ; if ( ( fp =fopen(“datafile.txt”, “wb+”) ) = = NULL ) { printf(“Can not open this file!\n”) ; exit( 0 ) ; } for ( j=0 ; j<10 ; j++ ) { scanf(“%d”, &m ) ; fwrite( &m , 2 , 1 , fp ) ; } rewind ( fp ) ; { fread ( &n , 2 , 1 , fp ) ; printf(“%4d”, n ) ; } fclose (fp) ; }

3.文件的顺序读写 格式化输入输出函数 格式 fprintf ( 文件指针变量 , 格式字符串 , 输出表列 ) ; fscanf ( 文件指针变量 , 格式字符串 , 输入表列 ) ; #include <stdio.h> #include <stdlib.h> void main ( ) { FILE *fp ; int a , b , c , d ; if ( ( fp =fopen(“exfile”, “wb+”) ) = = NULL ) { printf(“Can not open this file!\n”) ; exit( 0 ) ; } scanf(“%d%d”, &a , &b) ; fprintf( fp , “%d , %d\n” , a , b ) ; rewind(fp) ; fscanf( fp , “%d , %d” , &c , &d ) ; printf(“%d , %d\n”, c , d ) ; fclose(fp); }

4.文件定位与随机读写 文件的读写位置指针 文件中有一个读写位置指针 , 指向当前读或写的位置 前面讲的文件读写都是顺序读写 , 此时位置指针对当前所指向的数据项进行读或写操作后 , 位置指针会自动指向下一个数据项。 如能控制位置指针的指向, 就能实现随机读写

4.文件定位与随机读写 文件定位 fseek函数 格式: fseek ( 文件指针变量, 位移量, 起始点 ) ; 说明 位移量 是一个 long int 型数据 , 表示以“起始点”为基点向前或向后要移动的字节数, 正数表示向前移动(文件头文件尾); 负数表示向后移动 起始点 表示从什么位置为基准移动 , 用数字代表 0 -- 文件开始处 1 -- 文件位置指针的当前指向 2 -- 文件末尾处 函数返回值: 成功返回 0 , 出错返回 非 0 值

4.文件定位与随机读写 文件定位 ftell函数 格式: 长整型变量 = ftell ( 文件指针变量 ) ; 作用 说明 得到文件中位置指针的当前指向 , 这个位置是相对于文件开头的位移量 例 : long n ; n = ftell (fp ) ; if ( n= = -1L ) printf(“error!”) ;

4.文件定位与随机读写 文件定位 rewind函数 (无返回值) 例题 格式: rewind(文件指针变量) ; 作用 将文件位置指针重新返回到文件开头 例题 输入学生信息, 保存在文件中, 再从文件中读取学生信息输出到显示器上

4.文件定位与随机读写 文件定位 例题 输入学生信息, 保存在文 件中, 再从文件中读取学 生信息输出到显示器上 #include <stdio.h> #include <stdlib.h> #define SIZE 4 struct stud { char name[10]; int num; int score; } st[SIZE]; long len=sizeof(struct stud); void save( ) { FILE *fp; int i ;  if((fp=fopen(“studata”,“wb”))==NULL) { printf(“can not open this file!\n”); exit(0); } for( i=0; i<SIZE; i++) if( fwrite(&st[i], len, 1, fp)!=1 ) printf(“file write error!\n”); fclose(fp);} 文件定位 例题 void main( ) { FILE *fp; int i; struct stud x; for (i=0; i<SIZE; i++) scanf(“%s%d%d”, st[i].name, &st[i].num, &st[i].score); save( ); fp=fopen(“studata”,“rb”); for(i=0; i<SIZE; i++) { fread(&x, len ,1, fp); printf(“%-10s%4d%4d\n”, x.name, x.num, x.score);} fseek(fp, -2*len, 2); fread(&x, len ,1, fp); x.name, x.num, x.score); fclose(fp); }