文件操作--文件的随机读写、标准输入输出重定向

这篇具有很好参考价值的文章主要介绍了文件操作--文件的随机读写、标准输入输出重定向。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、文件的随机读写

二、便准输入输出重定向


一、文件的随机读写

        前面的例程执行的都是顺序文件处理(Sequential File Processing)。在顺序文件处理过程中,数据项是一个接着一个进行读取或者写入的。例如,如果想读取文件中的第5个数据项,那么使用顺序存取方法必须先读取前4个数据项才能读取第5个数据项。不同于顺序读写的是,文件的随机访问(Random Access)允许在文件中的随机定位,并在文件的任何位置直接读写数据。

        为了实现文件的定位,在每一个打开的文件中,都有一个文件位置指针(File Location Pointer),也称文件位置标记,用来指向当前读写文件的位置,它保存了文件中的位置信息。当对文件进行顺序读写时,每读完一个字节后,该位置指针自动移到下一个字节的位置。当需要随机读写文件数据时,则需要强制移动文件位置指针指向特定的位置。那么如何定位文件的位置指针呢?C语言提供了如下两个函数来定文件位置指针。

        int fseek(FILE *fp , long offset, int fromwhere);

        void rewind(FILE *fp); 

其中,函数fseek()的功能是将fp的文件位置指针从fromwhere开始移动offset个字节,指示下一个要读取的数据的位置。

        offset是一个偏移量,它告诉文件位置指针要跳过多少个字节。offset为正时,向后移动,为负时,向前移动。ANSI C要求位移量offset是长整型数据(常量数据后要加L)。这样当文件的长度大于64kb是不至于出问题。

        fromwhere用于确定偏移量计算的起始位置,它的可能取值有3中:

1、SEEK_SET或0,代表文件开始处;

2、SEEK_CUR或1,代表文件当前位置;

3、SEEK_END或2,代表文件结尾处。

        通过指定fromwhere和offset的值,可使位置指针移动到文件的任意位置,从而实现文件的随机读取。如果函数fseek()调用成功,则返回0值,否则返回非0值。

        函数rewind()的功能是将文件位置指针指向文件首字节,即重置位置指针到文件首部。

        C语言还提供了一个用来读取当前文件位置指针的函数,其函数原型为:

        long ftell (FILE *fp);

        若函数调用成功,则返回文件的当前读写位置,否则返回-1L。函数ftell()用相对于文件起始位置的字节偏移量来表示返回的当前文件位置指针。

注意:缓冲区为文件传输读写提高了速度,但是也有一些副作用。

例如,在缓冲区内容还未写入磁盘时,计算机突然死机或掉电,数据就会丢失,永远也找不回来。再如,缓冲区被写入无用的数据时,如果不清除,其后的文件读操作都首先会读取那些无用的数据。那么如何解决这个问题呢?

        为了解决这个问题,C语言提供了如下的函数:

        int  fflush (FILE *fp);

fflush()的功能是无条件地把缓冲区中地所有数据写入物理设备。这样,程序员可自己决定再何时清除缓冲区中的数据,以确保输出缓冲区中地内容写入文件。

例题:编程从文件student.txt中随机读取第k条记录地数据并显示到屏幕上,k由用户从键盘输入。

#include <stdio.h>
#include <stdlib.h>
typedef struct date
{
	int year;
	int month;
	int day;
}DATE;
typedef struct student
{
	long studentid;
	char studentname[10];
	char studentsex;
	DATE birthday;
	int score[4];
	float aver;
}STUDENT;
void searchinfile(char filename[],long k);
int main(void)
{
	long k;
	printf("Input the searching record number:");
	scanf("%ld",&k);
	searchinfile("student.txt",k);
	return 0;
 } 

void searchinfile(char filename[],long k)
{
	FILE *fp;
	int j;
	STUDENT stu;
	if((fp = fopen(filename,"r"))==NULL)
	{
		printf("Failure to open %s!\n",filename);
		exit(0);
	}
	fseek(fp,(k-1)*sizeof(STUDENT),SEEK_SET);
	fread(&stu,sizeof(STUDENT),1,fp);
	printf("%10ld%8s%3c%6d/%02d/%02d",stu.studentid,stu.studentname,stu.studentsex,stu.birthday.year,stu.birthday.month,stu.birthday.day);
	for(j=0;j<4;j++)
	{
		printf("%4d",stu.score[j]);
	 } 
	printf("%6.lf\n",stu.aver);
	fclose(fp);
}

 

文件操作--文件的随机读写、标准输入输出重定向,c++

         程序第28~49行定义的函数searchinfile()的功能是从文件filename中查找并显示第k条记录的数据,函数serchinfile()的第1个形参filename是字符数组,用于存放需要读取的文件名,程序第24行将文件名字符串“student.txt”作为实参传递给形参filename,函数searchinfile()的第2个形参k是长整型变量,表示要读取的记录号,为了在文件中直接读取第k条记录,程序第38行用函数fseek()将文件位置指针从文件开头向后移动(k-1)*sizeof(STUDENT)个字节。

        关于偏移量,这里之所以这样计算偏移量,是因为fseek()的第2个参数要给出文件位置指针所需跳过的字节数,二每条记录的长度是sizeof(STUDENT)个字节。

        同理,因函数ftell()返回的文件位置使用字节偏移量表示的,所以必须通过除以sizeof(STUDENT)才能换算成当前的记录号,例如,若在本例题中:

        printf ("record number = %d\n",ftell(fp)/sizeof(STUDENT)+1);

文件操作--文件的随机读写、标准输入输出重定向,c++ 

        这说明在执行第38行语句后文件位置指针指向了第2条记录,而用函数fread()读取一条记录数据后,文件位置指针又指向了吓一条记录,即第3条记录。 

二、便准输入输出重定向

        前面程序对数据的输入/输出是通过终端设备来完成的,看似与文件毫无瓜葛,但实际上,对于终端设备,系统自动会打开3个标准文件:标准输入、标准输出和标准错误输出。

相应的,系统定义了3个特别的文件指针常数:stdin、stdout、stderr,分别指向便准输入、输出和错误文件,这3个文件都以标准终端设备作为输入/输出对象。在默认情况下,标准输入设备是键盘,输出设备是屏幕。

1.fprintf是printf的文件操作版,二者的差别就在于fprintf多一个FILE *类型的参数fp。

2.fputc和putchar差别跟fprintf和printf的差别差不多。

例如:

putchar(c);    fputc(c,stdout);

3.getchar();  ==  fgetc(stdin);

4.puts(str);   ==  fputs(str,stdout);

5.fgets()比gets()多一个参数size。

char *fgets(char *s,int size,FILE *stream);

char *gets(char *s);

例如:

gets(buffer);

fgets(buffer, sizeof(buffer),stdin);

        虽然系统隐含的标准I/O文件是指终端设备,但其实标准输入和标准输出是可以重新定向的,操作系统可以重定向它们到其他文件或具有文件属性的设备,只有标准错误输出不能重定向。(简单描述:没有显示器屏幕,重定向后可以通过打印机输出)

这里,用“<”表示输入重定向,用“>”表示输出重定向。

例如:假设exefile是可执行程序的文件名,指向该程序时,需要输入数据,现在如果要求从文件file.in中读取数据,而非键盘输入,那么DOS命令提示符下,只要键入如下命令即可:

C:\exefile.exe<file.in

于是,exefile的便准输入就被重定向到了file.in,此时程序exefile只会专心致志地从文件file.in中读数据,而不再理会你此后按下的任何一个按键。

freopen()可用于指定模式将输入或输出重定向到另一个文件。

常见地使用方式:

freopen("D:\\in.txt","r",stdin);//将输入流定位到in.txt

freopen("CON","r",stdin); //将输入流还原到键盘

freopen("D:\\out.txt","w",stdout);//将输出流定位到out.txt

freopen("CON","w",stdout);//将输出流还原到屏幕 文章来源地址https://www.toymoban.com/news/detail-553411.html

到了这里,关于文件操作--文件的随机读写、标准输入输出重定向的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Bash将输出同时重定向到标准输出stdout和文件

    本文参考How to redirect output to a file and stdout。 对于任意原本默认输出到标准输出 stdout 的程序或命令 foo ,只需执行 即可同时输出到 output.file 文件。 例如,若想输出当前目录下的所有目录与文件到标准输出 stdout 的同时保存到 output.file 文件,执行 如果同时想输出程序或命令的

    2024年04月14日
    浏览(32)
  • Linux- 重定向标准输出(stdout)和标准错误(stderr)

    在Linux或Unix系统中,可以通过重定向标准输出(stdout)和标准错误(stderr)来将脚本的输出保存到一个文件中。以下是一些方法: 只重定向标准输出到文件 : 这将只捕获正常的输出(stdout),但不包括错误消息(stderr)。 同时重定向标准输出和标准错误到同一个文件 : 这

    2024年02月11日
    浏览(24)
  • 【Linux】重定向(输入重定向 | 输出重定向)

    为了有效地让 Linux 程序协同工作,我们需要对命令输入输出进行重定向(Redirection),并将一个命令的输出通过管道(Pipes)连接到另一个程序的输入。本文将介绍如何在 Linux 中使用输入输出重定向。 输入输出文本流(I/O Stream) 表1 bash 使用的三种标准输入输出流 字段 描述

    2023年04月20日
    浏览(23)
  • Python三种标准输出重定向方法

    Python 提供了标准库中的 sys.stdout 对象来代表标准输出。如果我们想将输出重定向到其他位置,例如内存、文件或自定义类,我们可以通过一些技巧来实现。 1. 重定向到内存 要将输出重定向到内存,我们可以使用 StringIO 模块。下面是一个示例:  在上面的示例中,我们首先创

    2024年02月03日
    浏览(26)
  • 一文搞懂Linux的标准输出/错误重定向

     今天在写一个脚本时,需要将shell命令和可执行程序的输出重定向在某一个log文件中,但是遇到了点小问题,索性就研究下输出重定向到底怎么回事。  Linux系统,有一个非常重要概念,就是一切皆文件。在使用shell脚本时,系统为了能够进行接收外部输入,同时向外部输出

    2023年04月26日
    浏览(37)
  • Shell输入输出重定向

    英文是file descriptor简称fd。 文件描述符是一个非负整数。它是一个索引值,指向进程打开的文件。 Linux程序在执行任何形式的 I/O 操作时,都是在读取或者写入一个文件描述符。 每个文件描述符会与一个打开的文件相对应。 不同的文件描述符也可能指向同一个文件。 在Linu

    2024年02月07日
    浏览(31)
  • Linux输入输出重定向

    目录 Linux输入输出重定向 Linux中的默认设备 输入输出重定向定义 输入输出重定向操作符 实用形式 标准输入、标准输出、标准错误 输出重定向案例 案例1 --- 输出重定向(覆盖) 案例2 --- 输出重定向(追加)  案例3 --- 错误输出重定向 案例4 --- 正确和错误都输入到相同位

    2024年02月04日
    浏览(41)
  • 「Linux系列」Shell 输入/输出重定向

    在Shell中,输入重定向允许你将一个文件或命令的输出作为另一个命令的输入,而不是从标准输入(通常是键盘)读取。这是通过特殊符号 实现的。使用输入重定向,你可以将文件的内容作为命令的输入,从而执行特定的操作。 下面是一个Shell输入重定向的案例: 假设你有一

    2024年04月15日
    浏览(32)
  • 使用重定向输入和输出创建子进程

    本主题中的示例演示了如何使用 CreateProcess 函数从控制台进程创建子进程。 它还演示了一种使用匿名管道重定向子进程的标准输入和输出句柄的技术。 请注意,命名管道还可用于重定向进程 I/O。 CreatePipe 函数使用 SECURITY_ATTRIBUTES 结构创建两个管道的读取和写入端的可继承句

    2024年02月07日
    浏览(26)
  • 【Java】文件的操作与输入输出流

    1. 狭义上的文件 : 硬盘上保存的数据,都是“文件”来组织的,本质上都是二进制或是字符组织的数组,被打包成一个文件存在硬盘上。常见的文件有图片,文本,可执行文件,音频,视频…文件夹也是一种特殊的文件,也叫目录通常所说的文件都是存储在硬盘上面的,硬

    2024年02月03日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包