⽂件操作函数

1. 流和标准流

1.2 流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。 C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。 ⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

1.3 标准流

1. stdin- 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。 

2.  stdout- 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出 流中。

 3.  stderr- 标准错误流,⼤多数环境中输出到显⽰器界⾯。

 这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。 stdin、stdout、stderr三个流的类型是: FILE* ,通常称为⽂件指针。 C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

1.4 ⽂件指针

       缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。 每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的,取名FILE.

1.5 ⽂件的打开和关闭

     ⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。 在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系。 ANSIC规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

//打开⽂件 
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件 
int fclose ( FILE * stream );

 mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:

 

/* fopen fclose example */
#include <stdio.h>
int main ()
{
 FILE * pFile;
 //打开⽂件 
 pFile = fopen ("myfile.txt","w");
 //⽂件操作 
 if (pFile!=NULL)
 {
 fputs ("fopen example",pFile);
 //关闭⽂件 
 fclose (pFile);
 }
 return 0;
}

 1.6顺序读写函数介绍

 上⾯说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀ 般指适⽤于标准输出流和其他输出流(如⽂件输出流)。

1.6.1 函数详解

fgetc函数

fgetc 从文件流中获取字符

#include<stdio.h>

int main()
{
	FILE* pf = fopen("test2.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c", ch);
	}

	fclose(pf);
	pf = NULL;
	return 0;
}

fputc 函数

 fputc("写入的字符",文件流的指针);

#include<stdio.h>

int main()
{
	FILE* pf = fopen("test2.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	char ch = 0;
	for (ch = 'a'; ch < 'z'; ch++)
	{
		fputc(ch, pf);
	}


	fclose(pf);
	pf = NULL;
	return 0;
}

fgets 函数

 fgets(读取文本存放的数组,读取文本的个数,所在的文件流的指针)

 

#include<stdio.h>

int main()
{
	FILE* pf = fopen("test2.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	char arr[100] = { 0 };//先定义一个字符的数组

	while (fgets(arr, 100, pf) != NULL);
	{
		printf("%s", arr);
	}

	fclose(pf);
	pf = NULL;
	return 0;
}

fputs 函数

 fputs("被写入的文本",对应的文件流)

#include<stdio.h>

int main()
{
	FILE* pf = fopen("test2.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fputs("hello world\n", pf);
	fputs("relax youself\n", pf);

	fclose(pf);
	pf = NULL;
	return 0;
}

fscanf 函数

 fscanf(对应的文件流指针 ,  相应的占位符,例如:%s %d %f ,占位符对应的变量)

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "张三",20,65.5f };
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fscanf(pf, "%s %d %f\n", s.name, &(s.age), &(s.score));//读,char类型的不用&
	printf("%s %d %f\n", s.name, s.age, s.score);

	fclose(pf);
	pf = NULL;
	return 0;
}

 fprintf 函数

 fprintf(对应的文件流指针,写入内容对应的占位符,写入内容对应的变量)

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "张三",20,65.5f };
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fprintf(pf, "%s %d %f", s.name, s.age, s.score);//写

	fclose(pf);
	pf = NULL;
	return 0;
}

fread 函数

 fread(读取文件后放在的数组arr ,每个元素的大小sizeof(int[0]) ,几个元素 , 文件流对应的指针)

 

#include<stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5 };

	FILE* pf = fopen("data.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	fread(arr, sizeof(arr[0]), 5, pf);
	int a = 0;
	for (a = 0; a < 5; a++)
	{
		printf("%d ", arr[a]);
	}

	fclose(pf);
	pf = NULL;
	return 0;
}

fwrite 函数

 fwrite(写文件后放在的数组arr ,每个元素的大小sizeof(int[0]) ,几个元素sizeof(arr)/sizeof(int[0]), 文件流对应的指针)

 

#include<stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5 };

	FILE* pf = fopen("data.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	int sz = sizeof(arr) / sizeof(arr[0]);
	fwrite(arr, sizeof(arr[0]), sz, pf);

	fclose(pf);
	pf = NULL;
	return 0;
}

 1.7 对⽐⼀组函数:

1. scanf/fscanf/sscanf

2. printf/fprintf/sprintf

1.1 scanf 从标准输入流中读取格式化数据

1.2  fscanf 从指定的标准输入流中读取格式化的数据

1.3 sscanf 在字符串中读取格式化的数据

 

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	char buf[200] = { 0 };
	struct S s = { "张三",20,65.5f };
	sprintf(buf, "%s %d %f", s.name, s.age, s.score);
	printf("1.以字符串的形式:%s\n", buf);

	struct S t = { 0 };
	sscanf(buf, "%s %d %f", t.name, &(t.age), &(t.score));
	printf("2.按照格式打印:   %s %d %f", t.name, t.age, t.score);

	return 0;
}

 2.1 printf 把数据以格式化的形式打印在标准输出流上

2.2 fprintf 把数据以格式化的形式打印在指定的标准输出流上

2.3 sprintf 把数据转化为字符串

 

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	char buf[200] = { 0 };
	struct S s = { "张三",20,65.5f };
	sprintf(buf, "%s %d %f", s.name, s.age, s.score);
	printf("1.以字符串的形式:%s\n", buf);

	struct S t = { 0 };
	sscanf(buf, "%s %d %f", t.name, &(t.age), &(t.score));
	printf("2.按照格式打印:   %s %d %f", t.name, t.age, t.score);

	return 0;
}

 2. ⽂件的随机读写

2.1 fseek函数

根据⽂件指针的位置和偏移量来定位⽂件指针。

fseek(文件流对应的指针,偏移量,起始位置)

1. SEEK_SET 文件的起始位置

2. SEEK_CUR 文件指针的当前位置

3. SEEK_END 文件的末尾

 

#include<stdio.h>

int main()
{
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	int ch = fgetc(pf);
	printf("%c\n", ch);

	fseek(pf, 4, SEEK_CUR);
	fseek(pf, 5, SEEK_SET);
	fseek(pf, -4,SEEK_END);

	ch = fgetc(pf);
	printf("%c\n", ch);

	fclose(pf);
	pf = NULL;

	return 0;
}

2.2 ftell 函数

返回⽂件指针相对于起始位置的偏移量

 

/* ftell example : getting size of a file */
#include <stdio.h>
int main ()
{
 FILE * pFile;
 long size;
 pFile = fopen ("myfile.txt","rb");
 if (pFile==NULL) 
 perror ("Error opening file");
 else
 {
 fseek (pFile, 0, SEEK_END); // non-portable
 size=ftell (pFile);
 fclose (pFile);
 printf ("Size of myfile.txt: %ld bytes.\n",size);
 }
 return 0;
}

2.3 rewind函数

 

/* rewind example */
#include <stdio.h>
int main ()
{
 int n;
 FILE * pFile;
 char buffer [27];
 
 pFile = fopen ("myfile.txt","w+");
 for ( n='A' ; n<='Z' ; n++)
 fputc ( n, pFile);
 rewind (pFile);
 
 fread (buffer,1,26,pFile);
 fclose (pFile);
 
 buffer[26]='\0';
 printf(buffer);
 return 0;
}

3. ⽂件读取结束的判定

3.1 被错误使⽤的 feof 

牢记:在⽂件读取过程中,不能⽤feof函数的返回值直接来判断⽂件的是否结束。

feof 的作⽤是:当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束。

⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )

例如:

• fgetc 判断是否为 EOF .

 • fgets 判断返回值是否为 NULL .

3.2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。

例如: • fread判断返回值是否⼩于实际要读的个数。

⽂本⽂件的例⼦:

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
 int c; // 注意:int,⾮char,要求处理EOF 
 FILE* fp = fopen("test.txt", "r");
 if(!fp) {
 perror("File opening failed");
 return EXIT_FAILURE;
 }
 //fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF 
 while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环 
 { 
 putchar(c);
 }
 //判断是什么原因结束的 
 if (ferror(fp))
 puts("I/O error when reading");
 else if (feof(fp))
 puts("End of file reached successfully");
 
 fclose(fp);
}

⼆进制⽂件的例⼦:

#include <stdio.h>
 
enum { SIZE = 5 };
int main(void)
{
 double a[SIZE] = {1.,2.,3.,4.,5.};
 FILE *fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式 
 fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组 
 fclose(fp);
 double b[SIZE];
 fp = fopen("test.bin","rb");
 size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组 
 if(ret_code == SIZE) {
 puts("Array read successfully, contents: ");
 for(int n = 0; n < SIZE; ++n) 
 printf("%f ", b[n]);
 putchar('\n');
 } else { // error handling
 if (feof(fp))
 printf("Error reading test.bin: unexpected end of file\n");
 else if (ferror(fp)) {
 perror("Error reading test.bin");
 }
 }
 
 fclose(fp);
}

  • 22
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于java实现的数据库管理系统 ⼀、需求分析说明 通过对数据库系统原理的学习,掌握数据库管理系统的运⾏原理,尝试在给定的DBF操作框架的物理储存基础上通过java建⽴⼀个数据 库管理系统,以更好的温习学习的知识。 基本功能如下: 实现创建表,并把约束条存储到建⽴好的数据字典中 为表添加删除列操作和删除表操作 实现对表数据的插⼊操作,并实现插⼊前约束检测 实现对表数据删除操作 实现对表数据的修改操作,修改前对修改数据进⾏约束检测 实现对表数据的查询操作,完成多表查询,单条多条查询,单字段排序与多字段排序 实现对输⼊过的SQL语句进⾏系统⽇志记录,并添加时间 界⾯友好,易与操作,通过创建⼀个简单的窗⼝实现对SQL语句的输⼊和对运⾏结果的显⽰ 该系统存在于com.silence.mysql包中,系统夹⽬录下的data夹是数据库DBF的存储⽬录,logs夹是系统⽇志⽬录。 该模块是数据库系统的主模块,在包主⽬录下,包括三个类DBMS.java、DBMSForm.java、MyException: DBMS.java:系统的运⾏中⼼,通过输⼊的SQL语句开头将SQL语句传⼊到相应的⼦模块,并对SQL语句进⾏标准化预处理;通过对输⼊ 的正确的SQL语句实现对系统⽇志的记录 DBMSForm.java:系统的显⽰窗⼝,通过单例模式创建⼀个显⽰窗⼝,实现对SQl语句的输⼊操作和对运⾏结果的反馈显⽰,提供接⼝实现 让其他模块运⾏时对UI界⾯的即时刷新,该类中的main函数是系统的运⾏⼊⼝ MyException.java:⾃定义异常,通过接收⼦模块抛出的运⾏时异常,实现将异常反馈输出到UI界⾯中供⽤户参考 该模块在包名下的dbf包中,通过javadbf4.1.jar包提供的DBF操作函数库,实现对数据库DBF的读写操作,该模块包括 DBFContent.java和DBFUtils.java两个类。 DBFContent.java:这个是⼀个JavaBean,通过将读取到的DBF中数据存储到这个JavaBean中,实现对数据库中数据的操作 DBFUtils.java:DBF操作⼯具类,通过对javadbf4.1.jar中函数的调⽤,实现对DBF的读写操作,提供创建表,插⼊表和查询表 的操作函数 该模块在包名下的where包中,通过对SQL字符串中提取的where块的解析,实现将where语句条翻译成OR条组,OR条组中包括 AND条组,条组类中提供对⼀条记录的条匹配操作函数,进⽽实现对⼀条记录的where条匹配操作,供数据库⼦模块使⽤。该模块 包括两个类:OrOfWhere.java和AndOfWhere.java: OrOfWhere.java:每个实例代表由OR连接的条语句块的⼀边,OR语句块中可能包含多个And语句 AndOfWhere.java:每个实例代表⼀个AND连接的条语句块的⼀边,AND语句块实现了Between…and…、=、<>、<、<=、>、>=条 匹配 该模块在包名下的module包中,其中包括Create.java、Alter.java、Drop.java、Insert.java、Delete.java、Update.java、Select.java 七个功能,每个模块的构造函数和init()函数执⾏对SQL语句的解析和信息提取,合成可视化的执⾏类,模块中的excuteSQL()函数是该模 块的执⾏函数,执⾏结果返回到DBMSForm中进⾏UI刷新,信息反馈。 通过对Create table Student(列名 数据类型 约束条 ………);语句的截取得到表名,将"("和")"中间的字符串以逗号分开得到列 字符串,再以空格分解得到列名,类型和约束条。 通过对DBFUtils.createDBF()函数的调⽤实现表的创建操作,将约束条作为记录添加到data⽬录下的"constraint.dbf"中实现对约束 条的数据字典存储,操作过程中,primary key,unique,not null模仿Linux中的权限数的⽅式,primary key为1,unique为2,not null为4,来实现⼀个整数记录三个约束条的⽬的。 通过对SQL字符串拆分解析,提取表名、列名和"ADD"、"DROP",将对应数据表中的数据读取到内存中,并根据列名对 DBFContent中的字段数组进⾏增加和删除,再将执⾏后的DBFContent回写⼊DBF中,实现添加删除列操作。 由于每个数据库表以⼀个来存储,名即是表名,删除表操作实际上是提取SQL字符串中的表名,再到data夹下删除对应的 。 根据空格拆分SQL字符串,提取表名和列属性的键值对,通
c语⾔程序的写法,C语⾔- 所谓""是指⼀组相关数据的有序集合,该数据的集合的名字就是名。可以分为很多类,如源程序、⽬标、可执⾏ 、库等等。 通常是存放在外部介质上的(例如磁盘等),在使⽤时才会被调⼊内存中并执⾏。从⽤户的⾓度来看可以分为普通和设备。 普通是指存放在磁盘或者其它外部介质上的⼀个有序的集合,可以是源、⽬标、可执⾏程序等;也可以是⼀组待输⼊处理的原 始数据,或是⼀组输出的结果。对于源、⽬标、可执⾏程序可以称作程序,⽽输⼊输出数据可以称作数据。 设备是指与主机相联的各种外部设备,如显⽰器、打印机、键盘等。在操作系统中,把外部设备也看作是⼀个来进⾏管理,把他们 的输⼊输出等同于对磁盘的读写。 从编码的形式来看,可以分为ASCII码和⼆进制码。ASCII码也称作为,这种在磁盘中存放时每个字符 对应⼀个字节,⽤于存放相应的ASCII码。 ⼆进制是以⼆进制编码的⽅式来编写的。⼆进制虽然可以显⽰在屏幕上,但是却不能读懂。 的指针 在C语⾔中⽤⼀个指针变量指向⼀个,那么这个指针称为指针。另外,我们通过指针就可以对所指的进⾏各种操作。 ⼀般形式为: FILE* 变量标识符 解释:FILE应该是⼤写的,它实际上是由系统定义的⼀个结构体,该结构体包含了名、状态和当前位置等信息,因此在编写程 序的时候我们不需要过于关⼼FILE结构的细节部分。 // 案例1: FILE *fp; /*说明: fp表⽰FILE结构的指针变量,通过fp可以找到存放某⼀个信息的结构变量, 然后按照结构体提供的信息找到该,并对进⾏操作。*/ 的打开和关闭 在进⾏读写操作之前,要打开,当使⽤完后应关闭。打开就是建⽴的各种有关信息,并使指针指向,以便进 ⾏其他操作。⽽关闭就是切断指针和之间的关系,换⽽⾔之,就是禁⽌利⽤指针操作。 在C语⾔中,操作都是由库函数完成的。如fopen 和 fclose。 1. 的打开 fopen() fopen() 函数是⽤来打开⼀个,其⼀般的调⽤形式为: 指针名 = fopen(名,使⽤的⽅式); 注释: 指针名:必须被说明为FILE类型的指针变量; 名:被打开名; 使⽤的⽅式:的类型和操作要求 // 案例2: FILE* fp; fp = fopen("text","r"); /*说明: 在当前⽬录下打开text,只允许"读"的操作,并且让fp指针指向该*/ 使⽤的⽅式有12种,如下所⽰: "使⽤⽅ " 意义 " "----------"------------------------------:" ""rt" " 只读打开⼀个本,只允许读" ""wt" " 只写打开或者建⽴⼀个,只允许写数据" ""at" " 追加打开⼀个,并在末尾写数据" ""rb" " 只读打开⼀个⼆进制,只允许读" ""wt" " 只写打开或者建⽴⼀个⽽进制,只允许写" ""ab" " 追加打开⼀个⼆进制,并在末尾写数据" ""rt+" " 读写打开⼀个,允许读和写 " " "wt+" " 读写打开或建⽴⼀个,允许读写" ""at+" " 读写打开⼀个,允许读,或在末尾追加数据" ""rb+" " 读写打开⼀个⼆进制,允许读写" ""wb+" " 读写打开或者建⽴⼀个⼆进制,允许读写 " ""ab+" " 读写打开⼀个⼆进制,允许读,或在末追加数据" 说明: 由r、w、a、t、b、+六个字符拼成,个字符的意义: r(read):读 w(write):写 a(append):追加 t(text):,可省略不写 b(banary):⼆进制 6.+:读和写 // 案例3: FILE* fp; fd = fopen("./text","r"); if (NULL == fd) { printf("open error\n"); exit(1); } // ⽤读"r"的⽅式打开"./text";若打开失败时,fp为空,输出open error。 2. 的关闭 fclose()函数是指当使⽤完后,需要关闭。其⼀般形式为: fclose(指针); // 案例4: fclose(fp); // 说明:正常关闭时,fclose()函数的返回值是0。若返回⼀个⾮零的值,则表⽰关闭时发⽣错误 的读写 的读写是有多重⽅式的,它可以⼀个字节⼀个字节的读或写,也可以是⼀串⼀串的读或

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值