C语言中的文件操作详解

目录
  • 1.为什么使用文件
  • 2.什么是文件
    • 2.1程序文件
    • 2.2数据文件
    • 2.3文件名
  • 3.文件的打开和关闭
    • 3.1文件指针
    • 3.2文件的打开和关闭
  • 4.文件的顺序读写
  • 5.文件的随机读写
    • 5.1fseek
    • 5.2ftell
    • 5.3rewind
  • 6.文本文件和二进制文件
  • 7.文件读取结束的判定
    • 7.1被错误使用的feof
  • 8.文件缓冲区
  • 结论

1.为什么使用文件

在学习结构体时,写了一个简易的通讯录的程序,当程序运行起来的时候,可以在通讯录中增加和删除数据,此时数据是存放在内存当中的,当程序退出的时候,通讯录中的数据自然就不存在了,等下次通讯录运行的时候,数据又得重新录入了,这样的通讯录使用起来会有点难受。

所以应该通讯录应该要能够把数据给记录下来,只有选择删除的时候,数据才不复存在。而这就涉及到了数据持久化的问题,一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。

使用文件可以将数据直接存放到电脑的硬盘上,做到了数据的持久化。

2.什么是文件

磁盘上的文件是文件。

但是在程序设计中,文件可以分为两种:程序文件和数据文件(从文件功能的角度来分类)

2.1程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)

平时用来写C语言代码的那个文件就是源程序文件

可执行程序就是代码运行起来后弹出的那个黑框框

目标文件就是可执行程序在形成过程中生成的文件

2.2数据文件

文件的内容不一定是程序,而是程序运行起来时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

以下的内容基本都是围绕这个数据文件来展开的,而在之前所处理数据的输入以及输出都是以终端(终端就是输入输出设备)为对象的,即从终端的键盘上输入数据,运行结果输出(显示)到显示器上。

有时候会把信息输出到磁盘上面,当需要的时候再从磁盘上读取数据到内存中使用,这里处理的就是磁盘上文件。

2.3文件名

一个文件要有唯一的文件标识,以便用户识别和引用。

为了方便起见,文件标识通常被称为文件名。

文件名包含三个部分:文件路径+文件名主干+文件后缀

例如:C:\code\test.txt

3.文件的打开和关闭

3.1文件指针

缓冲系统中,关键的概念是“文件类型指针”,简称“文件指针”

每个被使用的文件都在内存中开辟了一个文件信息区,用来存放文件的相关信息(如文件的名字,文件的状态以及文件的位置等)。这些信息是保存在一个结构体变量中的,而这个结构体类型是由系统来声明的,取名FILE。

例如,在VS2013编译环境下提供的stdio.h头文件中有以下的文件类型声明:

struct _iobuf {
    char *_ptr;
    int  _cnt;
    char *_base;
    int  _flag;
    int  _file;
    int  _charbuf;
    int  _bufsiz;
    char *_tmpfname;
   };
typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心其中的细节。

一般通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

创建一个FILE*的指针变量:

FILE* pf://文件指针变量

定义pf是一个指向FILE类型数据的文件指针变量,可以使pf指向某个文件的文件信息区(一个结构体变量),通过该文件信息区中的信息就能够访问该文件,也就是说,通过文件指针变量能够找到与他关联的文件。

如图:

每个文件在打开的时候都会在内存中开辟一个文件信息区,这个文件信息区就是FILE结构体类型的变量,而此时文件指针就会指向这个变量。

3.2文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

在编写程序的时候,在打开文件的同时,都会放回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

ANSI C规定使用fopen函数来打开文件,使用fclose函数来关闭文件。

打开文件:

FILE* fopen(const char* filename, const char* mode);

关闭文件:

int fclose (FILE* stream);

用只写的方式打开文件

代码如下:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)//遇到错误时函数会返回NULL指针
	{
		perror("fopen");
		return 1;
	}
	//文件操作
	//
	//关闭文件
	fclose(pf);
	pf = NULL;//把文件指针置空,防止野指针的问题
	return 0;
}

在相应的目录下创建了一个test.txt文件,如果文件不存在,则进行创建,如果文件存在,则对文件的内容进行销毁

用只读的方式打开文件

代码如下:

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//文件操作
	//
	//关闭文件
	fclose(pf);
	pf = NULL;//把文件指针置空,防止野指针的问题
	return 0;
}

相应的目录下必须要存在这个test.txt文件,否则编译器会报错。

注意:在相应的目录下查看文件时要在查看中打开文件扩展名

以上fopen函数中的文件名参数写的都是相对路径,如果要写绝对路径的话要从对应的根目录开始写。

4.文件的顺序读写

先来认识一些输入和输出函数:

这里的输出流和输出流是一个抽象的概念,比如说一些外部设备如键盘、显示器、U盘等等,这些设备的输入和输出方式都是不同的,这个时候C语言中的库将这些输入和输出的方式都封装成一个流,只需要知道这个流就能完成一个输入和输出,而不用去学习硬件上的其他知识。

再打开编译器的时候,会默认打开三个流,分别是标准输入流、标准输出流和标准错误流

  • 标准输入流:stdin,指的是键盘
  • 标准输出流:stdout,指的是屏幕
  • 标准错误流:stderr,也是屏幕

接下来具体讲讲输入和输出函数

字符输出函数:

int  fputc(int c, FILE* stream);

fputc会返回被输出字符的ASCII码值,遇到错误时返回EOF。

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	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;
}

将字符a到z写到文件当中,也可以理解为将数据输出到文件里面,因为适用于所有输出流,所以这里的参数可以用文件流,文件流也是文件指针。

此时可以查看test.txt里面的数据:

字符输入函数:

int fgetc(FILE* stream);

fgetc会返回读到的字符的ASCII码值,当读到文件末尾或者遇到错误时会返回EOF。

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == EOF)
	{
		perror("fopen");
		return 1;
	}
	//读文件 - 输入操作
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c ", ch);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

从刚刚写的test.txt中读取信息,也就是从test.txt上的数据输入到了ch中,并在屏幕上输出。

可以将键盘和显示器作为输入和输出的参数:

int main()
{
	int ch = fgetc(stdin);
	fputc(ch, stdout);
	return 0;
}

文本行输出函数:

int fputs(const char* string, FILE* stream);

成功则返回非负指,遇到错误则返回EOF

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fputs("abcdefg\n", pf);
	fputs("hijklmn\n", pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

将字符串输出到文件中

 此时打开test1.txt查看数据:

如果输出流写stdout,可以输出到屏幕上来

文本行输入函数:

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

将输入的数据存储到string,会最多读取n-1个字符,最后1个字符为'\0',返回值为读取到的字符串,遇到错误时或EOF时返回NULL指针。

int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	char arr[256] = { 0 };
	while (fgets(arr, 256, pf) != NULL)
	{
		fputs(arr, stdout);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

将刚才test1.txt里面的内容作为输入的数据,然后在屏幕上将数据输出。

格式化输出函数:

int fprintf( FILE *stream, const char *format [, argument ]...);

和printf很像,只是printf的默认输出流是标准输出流,而这里的参数stream适用于所有的输出流

struct S
{
	char name[20];
	int age;
	double score;
};

int  main()
{
	struct S s = { "zhangsan", 20, 75.5 };
	//打开文件
	FILE* pf = fopen("test2.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf, "%s %d %f", s.name, s.age, s.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

此时已经把数据写入到了test2.txt里面,打开文件来查看一下:

同样的,stream位置的参数可以是标准输出流,这样数据就会输出到屏幕上面来了

struct S
{
	char name[20];
	int age;
	double score;
};

int  main()
{
	struct S s = { "zhangsan", 20, 75.5 };
	fprintf(stdout, "%s %d %f", s.name, s.age, s.score);
	return 0;
}

格式化输入函数:

int fscanf( FILE *stream, const char *format [, argument ]... );

fscanf和scanf和很像,只是scanf默认stream位置的参数是标准输入流,也就是键盘。

int  main()
{
	struct S s = {0};
	//打开文件
	FILE* pf = fopen("test2.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fscanf(pf, "%s %d% lf", s.name, &(s.age), &(s.score));
	fprintf(stdout, "%s %d %lf", s.name, s.age, s.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

将数据从文件上读取,然后在屏幕上输出。

 再来认识两个与printf和scanf很像的函数:

sprintf:将格式化的数据转换为字符串

int sprintf( char *buffer, const char *format [, argument] ... );

sscanf:将字符串转换为格式化的数据

int sscanf( const char *buffer, const char *format [, argument ] ... );

sprintf的使用:

struct S
{
	char name[20];
	int age;
	double score;
};

int main()
{
	char buf[256] = { 0 };
	struct S s = { "wangwu", 30, 85.5 };
	sprintf(buf, "%s %d %lf", s.name, s.age, s.score);
	printf("%s\n", buf);
	return 0;
}

将结构体的数据转换为字符串存入buf中,然后将buf在屏幕上输出出来。

 sscanf的使用:

struct S
{
	char name[20];
	int age;
	double score;
};

int main()
{
	char buf[256] = { 0 };
	struct S s = { "wangwu", 30, 85.5 };
	sprintf(buf, "%s %d %lf", s.name, s.age, s.score);
	//将字符串转化为格式化的数据
	struct S tmp = { 0 };
	sscanf(buf, "%s %d %lf", tmp.name, &(tmp.age), &(tmp.score));
	printf("%s %d %lf", tmp.name, tmp.age, tmp.score);
	return 0;
}

也可以认为是从字符串中提取数据存入到结构体tmp中来。

这里列在一起方便对比一下:

 二进制输出函数:

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

  • buffer:指向被读取的数据的指针
  • size:被读取的项目的字节大小
  • count:被读取的项目数的最大值
  • stream:文件流

fwrite的使用:

struct S
{
	char name[20];
	int age;
	double score;
};

int main()
{
	struct S s = { "lisi", 15, 95.5 };
	//打开文件
	FILE* pf = fopen("test3.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fwrite(&s, sizeof(struct S), 1, pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 因为是以二进制的方式写的,所以文件中存放的数据是这样子的:

二进制输入函数:

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

跟fwrite相反,将文件中的数据作为输入数据存储到buffer指向的空间中。

fread的使用:

struct S
{
	char name[20];
	int age;
	double score;
};

int main()
{
	struct S s = { 0 };
	//打开文件
	FILE* pf = fopen("test3.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %lf\n", s.name, s.age, s.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

5.文件的随机读写

5.1fseek

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

int fseek( FILE *stream, long offset, int origin );

  • stream:文件流
  • offset:相对于此时文件指针的位置的偏移量,单位是字节
  • origin:文件指针此时的位置

origin可以分为3个值:

SEEK_CUR - 文件指针当前的位置

SEEK_SET - 文件开始的位置

SEEK_END - 文件末尾的位置

先在对应的目录下创建一个test.txt文件,往里面写入a到f的字符

#include <stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//把a到f的字符写入文件
	char ch = 0;
	for (ch = 'a'; ch <= 'f'; ch++)
	{
		fputc(ch, pf);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

fseek的使用:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//让文件指针从此时的位置向后移动5个字节
	fseek(pf, 5, SEEK_CUR);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

找到f的位置并将其读取,输出在屏幕上,结果是f

offset输入负值也可以让指针往前走

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//让文件指针从文件尾的位置向前移动3个字节
	fseek(pf, -3, SEEK_END);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

最终屏幕上输出的结果是d

注意:文件末尾是f之后的那个位置

5.2ftell

放回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

ftell的使用: 

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fseek(pf, 0, SEEK_END);
	long size  = ftell(pf);
	printf("%ld\n", size);
	fclose(pf);
	pf = NULL;
	return 0;
}

对于test.txt这个文件,文件指针末尾的位置相对于起始位置是6.

使用比较简单,了解一下即可

5.3rewind

让文件指针回到文件的起始位置

void rewind( FILE *stream );

rewind的使用:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fseek(pf, 0, SEEK_END);
	//从文件尾回到文件起始位置
	rewind(pf);
	long size  = ftell(pf);
	printf("%ld\n", size);
	fclose(pf);
	pf = NULL;
	return 0;
}

文件指针先是走到文件末尾,最后回到起始位置,所以最终屏幕输出结果是0

6.文本文件和二进制文件

根据数据的储存形式,数据文件被称为文本文件和二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。外存可以理解为硬盘。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。前面fputc就是以ASCII字符的形式将数据存储在文件中。

下面来看一个数据在内存中是怎么存储的

字符一律以ASCII形式进行存储,数值型数据即可以用ASCII形式存储,也可以使用二进制形式来存储。

假设有一个整数为10000,如果以ASCII码的形式输出到磁盘,则在磁盘中占用5个字节(每个字符占用一个字节),而如果以二进制的形式输出到磁盘,则在磁盘上占用4个字节。

直接在记事本中输入10000,就是以ASCII码的形式进行存储。

可以将这个文件在编译器中打开

然后选择二进制的打开方式:

然后可以看到显示的结果是将二进制的形式转换为十六进制的形式

刚好对应着10000的ASCII码的存储形式

接下来看看以二进制的形式存储:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int a = 10000;
	fwrite(&a, sizeof(int), 1, pf);//二进制的形式写
	fclose(pf);
	pf = NULL;
	return 0;
}

再以二进制的形式打开test.txt

由于该编译器是小端字节序存储,所以可以看到16进制显示的数字是反过来的。

7.文件读取结束的判定

7.1被错误使用的feof

文件在读取的过程中,不能用feof函数的返回值来判断文件读取是否结束,而是应当用于在文件读取结束的时候,判断是因为读取失败造成的文件读取结束,还是因为遇到文件尾造成的文件读取结束。

文件的读取结束判断:

文本文件的读取结束判断:

fgetc函数判断返回值是否为EOF

fgets函数判断返回值是否为NULL

二进制文件的读取结束判断:

fread判断返回值(实际读到的个数)是否小于预计要读的个数

feof和ferror函数

feof

int feof( FILE *stream );

文件是由于读取到文件尾结束时返回一个非0值,反之返回0

ferror

int ferror( FILE *stream );

文件是由于读取错误而读取结束时返回一个非0值,反之返回0

文本文件的读取结束判断代码:

int main()
{
	int c; // 注意:int,非char,要求处理EOF
	FILE* fp = fopen("test.txt", "r");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	//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);
	fp = NULL;
	return 0;
}

二进制文件的读取结束判断代码:

enum
{
	SIZE = 5
};

int main(void)
{
	double a[SIZE] = { 1.,2.,3.,4.,5. };
	FILE* fp = fopen("test.txt", "wb");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组
	fclose(fp);
	fp = NULL;

	double b[SIZE];
	fp = fopen("test.txt", "rb");
	size_t ret_code = fread(b, sizeof * b, SIZE + 1, fp); // 读 double 的数组
	if (ret_code == SIZE)
	{
		puts("Array read successfully, contents: ");
		for (int n = 0; n < SIZE; ++n)
		printf("%f ", b[n]);
		putchar('\n');
	}
	if (feof(fp))//判断是否因为遇到文件尾造成的文件读取结束
		printf("Error reading test.txt: unexpected end of file\n");
	else if (ferror(fp)) //判断是否因为读取失败造成的文件读取结束
	{
		perror("Error reading test.txt");
	}
	fclose(fp);
	fp = NULL;
}

8.文件缓冲区

ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

图解:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("abcdef", pf);//先将代码放在输出缓冲区
	printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
	Sleep(10000);
	printf("刷新缓冲区\n");
	fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
	printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
	Sleep(10000);//此时睡眠10秒,是为了说明数据是由于fflush的刷新才输出到文件中的
	fclose(pf);
	//注:fclose在关闭文件的时候,也会刷新缓冲区
	pf = NULL;
	return 0;
}

fflush函数可以让数据不充满缓冲区时就直接输入或者输出

结论

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件,如果不做,可能会导致读写文件时数据不完全读写的问题。

到此这篇关于C语言中的文件操作详解的文章就介绍到这了,更多相关C语言文件操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言全面细致讲解文件操作

    目录 什么是文件 程序文件 数据文件 文件名 文件指针 文件的打开和关闭 文件的顺序读写 字符输入输出函数 字符串输入输出函数(fgets,fputs) 格式化输入输出函数(fscanf,fprintf) 二进制输入输出函数(fread,fwrite) 文件的随机读写 fseek ftell 文件读取结束的判定 什么是文件 磁盘上的文件是文件.但是在程序设计中,我们一般谈的文件有两种:程序文件.数据文件(从文件功能的角度来分类的). 程序文件 包括源程序文件(后缀为.c),目标文件(window

  • C语言超详细讲解文件的操作

    目录 一.为什么使用文件 二.什么是文件 1.程序文件 2.数据文件 3.文件名 三.文件指针 四.文件的打开和关闭 五.文件的顺序读写 六.文件的随机读写 fseek ftell rewind 七.文件结束判定 一.为什么使用文件 当我们写一些项目的时候,我们应该要把写的数据存储起来.只有我们自己选择删除数据的时候,数据才不复存在.这就涉及到了数据的持久化的问题,为我们一般数据持久化的方法有,把数据存在磁盘文件.存放到数据库等方式.使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久

  • C语言实现学生信息管理系统(文件操作)

    目录 新增函数——文件操作: 1.头文件和预处理 2.定义学生结构体的数据结构 3.定义每条记录或节点的数据结构 4.函数接口代码. 1.定义提示菜单 2.增加学生记录 3.输入学号接口· 4.遍历表中学生 5.增加学生记录 6.删除学生信息 7.查找学生信息 8.修改学生信息 9.统计学生人数 10.清空链表 11.文件操作 5.main函数 6.学生信息管理系统总源码(可直接复制运行) 7.测试结果 本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 前言:与

  • C语言常见的文件操作函数

    目录 一.文件的打开和关闭 1.文件指针 2.文件打开和关闭 二.文件的顺序读写 1.fgetc()和fputc()函数 2.fgets()和fputs()函数 3.fscanf()和fprintf()函数 4.fread()和fwrite()函数 三.文件的随机读写 1.fseek函数 2.ftell函数 3.rewind函数 四.文本文件和二进制文件 五.文件读取结束的判定 六.文件缓冲区 总结 一.文件的打开和关闭 1.文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存

  • C语言文件操作之fread函数详解

    目录 前言 一.fread 函数 二.缓冲区受限的情况 ( 循环读取文件 | feof 函数判定文件读取完毕 ) 三.处理乱码问题 四.记录读取的字节个数 五.读取到 0 字节的情况 六.读取完毕的情况 七.读取文本文件 “\n” 与 读取二进制文件 “\r\n” 区别 总结 前言 二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ; fread / fwrite 函数 既可以操作 二进制文件 , 又可以操作 文本文件

  • C语言实现银行管理系统(文件操作)

    本文实例为大家分享了C语言实现银行管理系统的具体代码,供大家参考,具体内容如下 银行管理系统主要有五个模块组成: 1.查询账户信息2.存钱3.取款4.转账5.退出系统 测试文件:(首先在cpp文件所在目录下添加这个文件,运行程序会自动添加文件,但是需要输入这些数据) 代码: #include<stdio.h>    /*I/O函数*/ #include<stdlib.h>  /*其它说明*/ #include<string.h>  /*字符串函数*/ #define m

  • C语言关于文件的操作方法总结

    目录 什么是文件 程序文件 数据文件 文件名 为什么要使用文件 文件的操作 文件缓冲区 文件指针(FILE) 文件的打开和关闭 fopen fclose 文件的打开方式 流的相关概念 文件的顺序读写 fputc fgets 什么是文件 程序文件 其实从文件的功能的角度来说:我们的文件可以分为两种类型的文件:程序文件和数据文件. 就拿我们C语言的程序为例子,包括了程序文件,即后缀为.c的文件:目标文件,即在windows环境下后缀为.obj的文件:可执行程序文件,即后缀为.exe的文件. 数据文件

  • C语言中的文件操作详解

    目录 1.为什么使用文件 2.什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3.文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 4.文件的顺序读写 5.文件的随机读写 5.1fseek 5.2ftell 5.3rewind 6.文本文件和二进制文件 7.文件读取结束的判定 7.1被错误使用的feof 8.文件缓冲区 结论 1.为什么使用文件 在学习结构体时,写了一个简易的通讯录的程序,当程序运行起来的时候,可以在通讯录中增加和删除数据,此时数据是存放在内存当中的,当程序退出

  • C语言进阶之文件操作详解

    目录 0.Intro 1.文件名 2.文件的打开和关闭 2.1文件指针 2.2打开和关闭文件 3.文件顺序读写 3.1利用以上函数实现拷贝文件操作 3.2二进制的读写 3.3格式化输入输出函数 4.文件的随机读写操作 4.1fseek 4.2ftell 4.3rewind 5.文本文件和二进制文件 5.1一个数据在内存中的存储方式 6.文件读取错误的判定 6.1被错误使用的feof 7.文件缓冲区 7.1行缓冲 总结 0. Intro 在使用操作数据库之前,记录信息,录入数据需要文件操作,这样就

  • Go语言学习之文件操作方法详解

    目录 引言 1. 打开和关闭文件 2. 读取文件 2.1 defer 语句 2.2 手动宕机处理 2.3 打开文件并获取内容 2.4 bufio 读取文件 2.5 ioutil 读取文件 2.6 读取奇偶行内容 3. 写入文件 3.1 os.OpenFile() 函数 3.2 Write 和 WriteString 方式写入 3.3 bufio.NewWriter 方式写入 3.4 ioutil.WriteFile 方式写入 引言 计算机的文件是存储再外部介质(硬盘)上的数据集合,文件分为文本文

  • Node.js基础入门之缓存区与文件操作详解

    目录 缓存区 1. 什么是缓存区? 2. 创建指定长度的缓存区 3. 通过数组创建缓存区 4. 通过字符串创建缓存区 5. 读写缓存区 6. 复制缓存区 文件操作 1. 异步直接读取 2. 同步直接读取 3. 流式读取 4. 写入文件 5. 流式写入文件 6. 读取文件信息 7. 删除文件 8. 管道 9. 链式流 经过前面三天的学习,Node.js的基础知识已逐渐掌握,今天继续学习缓存区和文件操作,并稍加整理加以分享,如有不足之处,还请指正. 缓存区 1. 什么是缓存区? JavaScript

  • Android 文件操作详解及简单实例

     Android 文件操作详解 Android 的文件操作说白了就是Java的文件操作的处理.所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了.好了,话不多说,开始今天的正题吧. 先从一个小项目入门吧 首先是一个布局文件,这一点比较的简单,那就直接上代码吧. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt

  • 易语言中数据库“更新索引”命令详解

    通过完全重建来更新当前数据库的当前索引. 成功返回真,失败返回假. 语法: 逻辑型 更新索引 () 例程: 说明: 打开数据库的同时,打开2个索引文件."更新索引"按钮被单击后,运行"更新索引()"命令,成功更新索引后,将当前打开的索引显示在列表框中. 以上就是易语言中数据库"更新索引"命令详解的详细内容,更多关于易语言更新索引命令的资料请关注我们其它相关文章!

  • C语言中 & 和 &&的区别详解

    这是c语言的基本语法,但是在学习的过程中也总是搞混.所以记录一下,也和大家分享一下. &:按照位与操作,例如:0010&1101,结果为0000 &是java中的位逻辑运算:       eg: 2&3=2: 分析如下: 2的二进制为10 :3的二进制为11 : 逻辑&之后为10 &&:短路与,表示如果两个条件都成立则执行之后的逻辑: 例如:if(a==0&&b==0),意思就是if a为0并且b为0的时候,进行下一步操作. || 短

  • Java IO流之原理分类与节点流文件操作详解

    目录 IO流简介 IO流原理 流的分类 IO 流体系 节点流和处理流 节点流操作 IO流简介 I/O是Input/Output的缩写, I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读/写文件,网络通讯等. Java程序中,对于数据的输入/输出操作以"流(stream)" 的方式进行. java.io包下提供了各种"流"类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据. IO流原理 输入input:读取外部数据(磁盘.光盘等存储设备的数据

  • C语言中随机数rand()函数详解

      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void);   rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(

  • python处理xml文件操作详解

    目录 1.python 操作xml的方式介绍 2.ElementTree模块 3.解析xml格式字符串并获取根节点 4.读取节点内容,getroot() 5.通标标签名直接获取标签(find,findall) 6.全文搜索标签名(类似xpath路径查找标签) 7.修改节点 8.删除节点 9.构建文件 方式1 (Element) 方式2 (makeelement) 方式3 1.python 操作xml的方式介绍 查看全部包含“三种⽅法: ⼀是xml.dom. * 模块,它是W3CDOMAPI的实现

随机推荐