请问下面这道C语言分段函数题代码怎么写?

*pr, *head;若要找到p的前驱结点并将地址保存在pr中,则下面正确的语句序列是

10、【单选题】下列叙述中正确的是

A、作为线性单向链表的尾结点,其指针域的值设为空指针NULL,表示链表的结束。

B、对于单向链表而言,一旦链表中某个结点的指针域数据丢失,将会导致无法找到下一个结点,进而丢失该节点后面的所有结点数据。

C、线性链表的长度是固定的,在访问之前就已经确定下来。

D、构成线性链表的存储单元是连续的,如结点P与它的前驱结点及后继结点之间就是连续的。

E、线性链表的数据域一般只包含一个成员数据,如data。

F、作为线性单向链表的尾结点,其指针域的值设为空指针void,表示链表的结束。

11、【单选题】关于队列的说法正确的是

A、队列和栈都属于线性结构

C、一个队列的入队顺序是a,b,c,d,则出队顺序应该是d,c,b,a

D、队列具有先进后出的特点

12、【单选题】关于树的说法错误的是

C、树是一种非线性结构

D、树的结点之间是一对多的关系

E、二叉树的左右子树不能交换

13、【单选题】关于单向链表说法错误的是

A、单向链表在内存中是连续存储的

B、结点的存储空间分两部分,一部分用于存储结点的数据,另一部分用于存储其他结点的指针

C、存储空间可以动态的获取和释放

D、与数据相比,单向链表适合反复进行删除、插入操作

1、【判断题】函数fgetc()的功能是从fp所指的文件中读取一个字符,并将位置指针指向下一个字符。若读取成功,则返回该字符,若读到文件末尾或者读取出错,则返回EOF。EOF是一个符号常量,通常在stdio.h中定义为-1。

2、【判断题】函数feof()的功能是检查是否到达文件尾,只要读完最后一个字符、文件位置指针指向文件尾时(EOF)时,就会返回非0值,否则返回0值。

1、【判断题】fgets()与gets()的不同点是,gets()从指定的流读字符串,读到换行符时将换行符替换为'\0',读入的字符串中不会保留'\n',而fgets()从指定的流读字符串,读到换行符时不替换为'\0',读入的字符串中会保留'\n',在'\n'的后面会再添加一个'\0'。

2、【判断题】fputs()是向任意流写数据,puts()是向标准输出流写数据,二者在写数据时的不同之处是,puts()会在写入的字符串末尾自动添加换行符,而fputs()不会在写入的字符串末尾自动添加换行符,除非字符串本身含有换行符。

练兵区——编程题——不计入总分

1、【单选题】若要以“a+”方式打开一个已存在的文件,则以下叙述正确的是

A、文件打开时,原有文件内容不被删除,位置指针移动到文件末尾,可做添加和读操作。

B、文件打开时,原有文件内容不被删除,位置指针移动到文件开头,可做重写和读操作。

C、文件打开时,原有文件内容被删除,只可做写操作。

D、以上各种说法都不正确。

2、【单选题】在C语言中,从计算机内存中将数据写入文件中,称为

A、程序完成将一个磁盘文件中的信息复制到另一个磁盘文件中的功能。

B、程序完成将磁盘文件的信息在屏幕上显示的功能。

C、程序完成将两个磁盘文件合二为一的功能。

D、程序完成将两个磁盘文件合并并在屏幕上输出的功能。

5、【单选题】C语言中标准输入文件stdin是指

7、【单选题】若要用fopen函数打开一个新的二进制文件,该文件要既能读也能写,则文件方式字符串应该是

8、【单选题】以下叙述中错误的是

A、C语言中顺序读写方式不适用于二进制文件

B、C语言中的文本文件以ASCⅡ码形式存储数据

C、C语言中对二进制文件的访问速度比文本文件快

D、C语言中随机读写方式不适用于文本文件

11、【单选题】关于文件读写,正确的叙述是

A、可把整型数以二进制形式存放到文件中的函数是fwrite函数。

B、使用fread可以直接将数值从二进制文件读入(拷贝)到程序的变量中。

C、使用fprintf函数可以将信息以文本的形式写入文件(类似向屏幕输出文本信息的printf函数)。

D、使用fscanf函数可以从文本文件,按格式读入int、float等各种类型的数值(类似从键盘读入信息的scanf函数)。

E、以二进制形式打开的文件,如果使用fprintf向文件写入所有数据,其结果是生成的文件还是个文本文件。

F、以文本方式打开的文件,如果使用fwrite向文件写入所有数据,其结果是生成的文件还是个二进制文件。正因如此,如果用文本编辑器打开这个文件查看文件中的内容会发现是乱码。

G、文件打开后一定要检查是否打开成功。

H、文件用完一定要关闭,否则,可能会引起数据丢失,或者影响其他文件的打开,因为多数情况下,系统限制同时处于打开状态的文件总数。

I、以r(只读)、a(追加)和r+(读写)方式打开文件时,该文件必须是已存在的文件,否则将打开不成功。

J、以w(只写)和w+(读写)方式打开一个文件时,无论该文件是否存在,都新建一个文件,这就意味着如果文件已存在,则其原有的内容将丢失。

K、文件一旦按文本方式打开,无论用fwrite还是fprintf函数写入数字1,最后生成的都是文本,对应的内容都是字符‘1’。

L、文件一旦按二进制方式打开,无论用fwrite还是fprintf函数写入数字1,最后生成的都是二进制文件,对应的内容都是数值1。

M、用FILE只能定义指向文本文件的文件指针。

N、用FILE只能定义指向二进制文件的文件指针。

O、C语言中的文件都是流式文件,只能按顺序读写,不能进行随机读写。

P、文件的读写方式中w+和r+都是可读可写方式,二者是完全一样的。

12、【单选题】以下叙述中错误的是

A、不可以用FILE定义指向二进制文件的文件指针。

B、二进制文件打开后可以先读文件的末尾,而顺序文件不可以。

C、在程序结束时,应当用fclose()函数关闭已打开的文件。

D、在利用fread()函数从二进制文件中读数据时,可以用数组名给数组中所有元素读入数据。

13、【单选题】下列关于C语言数据文件的叙述中正确的是

A、文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件

B、文件由ASCII码字符序列组成,C语言只能读写文本文件

C、文件由二进制数据序列组成,C语言只能读写二进制文件

D、文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件

14、【单选题】若fp已正确定义并指向某个文件,当未遇到该文件结束标志时函数feof(fp)的值为

15、【单选题】在进行文件操作时,写文件的一般含义是

A、将计算机内存中的信息存入磁盘。

B、将磁盘中的信息存入计算机内存。

C、将计算机CPU中的信息存入磁盘。

D、将磁盘中的信息存入计算机CPU。

A、函数fopen()调用形式错误

C、函数fgetc()调用形式错误

D、文件指针stdin没有定义

练兵区——单选题——不计入总分

3、【单选题】下列关于C语言数据文件的叙述中正确的是

A、文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件

B、文件由ASCII码字符序列组成,C语言只能读写文本文件

C、文件由二进制数据序列组成,C语言只能读写二进制文件

D、文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件

A、函数fopen()调用形式错误

C、函数fgetc()调用形式错误

D、文件指针stdin没有定义

A、程序完成将一个磁盘文件中的信息复制到另一个磁盘文件中的功能。

B、程序完成将磁盘文件的信息在屏幕上显示的功能。

C、程序完成将两个磁盘文件合二为一的功能。

D、程序完成将两个磁盘文件合并并在屏幕上输出的功能。

7、【单选题】C语言中标准输入文件stdin是指

8、【单选题】若要用fopen函数打开一个新的二进制文件,该文件要既能读也能写,则文件方式字符串应该是

9、【单选题】在进行文件操作时,写文件的一般含义是

A、将计算机内存中的信息存入磁盘。

B、将磁盘中的信息存入计算机内存。

C、将计算机CPU中的信息存入磁盘。

D、将磁盘中的信息存入计算机CPU。

10、【单选题】关于文件读写,正确的叙述是

A、可把整型数以二进制形式存放到文件中的函数是fwrite函数。

B、使用fread可以直接将数值从二进制文件读入(拷贝)到程序的变量中。

C、使用fprintf函数可以将信息以文本的形式写入文件(类似向屏幕输出文本信息的printf函数)。

D、使用fscanf函数可以从文本文件,按格式读入int、float等各种类型的数值(类似从键盘读入信息的scanf函数)。

E、以二进制形式打开的文件,如果使用fprintf向文件写入所有数据,其结果是生成的文件还是个文本文件。

F、以文本方式打开的文件,如果使用fwrite向文件写入所有数据,其结果是生成的文件还是个二进制文件。正因如此,如果用文本编辑器打开这个文件查看文件中的内容会发现是乱码。

G、文件打开后一定要检查是否打开成功。

H、文件用完一定要关闭,否则,可能会引起数据丢失,或者影响其他文件的打开,因为多数情况下,系统限制同时处于打开状态的文件总数。

I、以r(只读)、a(追加)和r+(读写)方式打开文件时,该文件必须是已存在的文件,否则将打开不成功。

J、以w(只写)和w+(读写)方式打开一个文件时,无论该文件是否存在,都新建一个文件,这就意味着如果文件已存在,则其原有的内容将丢失。

K、文件一旦按文本方式打开,无论用fwrite还是fprintf函数写入数字1,最后生成的都是文本,对应的内容都是字符‘1’。

L、文件一旦按二进制方式打开,无论用fwrite还是fprintf函数写入数字1,最后生成的都是二进制文件,对应的内容都是数值1。

M、用FILE只能定义指向文本文件的文件指针。

N、用FILE只能定义指向二进制文件的文件指针。

O、C语言中的文件都是流式文件,只能按顺序读写,不能进行随机读写。

P、文件的读写方式中w+和r+都是可读可写方式,二者是完全一样的。

11、【单选题】若要以“a+”方式打开一个已存在的文件,则以下叙述正确的是

A、文件打开时,原有文件内容不被删除,位置指针移动到文件末尾,可做添加和读操作。

B、文件打开时,原有文件内容不被删除,位置指针移动到文件开头,可做重写和读操作。

C、文件打开时,原有文件内容被删除,只可做写操作。

D、以上各种说法都不正确。

12、【单选题】在C语言中,从计算机内存中将数据写入文件中,称为

13、【单选题】以下叙述中错误的是

A、C语言中顺序读写方式不适用于二进制文件

B、C语言中的文本文件以ASCⅡ码形式存储数据

C、C语言中对二进制文件的访问速度比文本文件快

D、C语言中随机读写方式不适用于文本文件

15、【单选题】以下叙述中错误的是

A、不可以用FILE定义指向二进制文件的文件指针。

B、二进制文件打开后可以先读文件的末尾,而顺序文件不可以。

C、在程序结束时,应当用fclose()函数关闭已打开的文件。

D、在利用fread()函数从二进制文件中读数据时,可以用数组名给数组中所有元素读入数据。

16、【单选题】若fp已正确定义并指向某个文件,当未遇到该文件结束标志时函数feof(fp)的值为

}

大文件分块上传的前后端实现

在实际项目中开发中,文件上传是大多数项目中的强需求,尤其是大文件的上传,比如上传一个视频到某网站或者云盘应用中,由于网络等因素经常会导致上传过程中断,不得不重新上传。虽然刘欢老师的歌曲里唱的不错,“只不过是从头再来”,但是在实际应用中我们都是通过文件分块上传以及断点续传功能来避免在上传过程中发生中断后不得不从头再来的尴尬。

本文详细介绍了大文件分块上传的全部流程,包括前端需要的预备知识以及后端的完整实现,所以本文包括两大部分:大文件分块读取以及断点续读的纯前端简易实现和大文件分块上传的前后端完整实现。本文涉及到相关技术有 HTML5 File API、HTML5

1. 大文件分块读取以及断点续读的纯前端简易实现

谈到文件的分块读取,必然是涉及到文件相关的API,对于断点续读,则是需要在本地保存下当前的读取进度,两者配合实现分块读取和断点续读,所以首先介绍HTML5中的FileAPI。

HTML5 File API操作文件主要分为两个大部分:选择文件和读取文件。

在选择文件之前,我们需要首先检测以下当前浏览器是否支持File API:

HTML5虽然可以让我们访问本地文件系统,但是JavaScript只能被动的读取,即:只有用户主动触发了文件读取行为,JavaScript才能访问到File API,通常的两种触发方式为:表单输入文件和拖拽文件。

在读取文件中,HTML5提供了一个FileReader的异步读取文件的接口,它主要定义了以下几个方法:

同时FileReader还提供了以下几个事件:

当调用了上述的某个方法开始读取文件后,就可以通过监听事件来获得结果和进度等。

File API在实际应用中主要有以下几个功能:

分割文件和分段读取文件

一次性大文件读入内存,并不是一个很好的选择,如果文件太大,可能直接导致浏览器崩溃,更好的实现方式是通过File API的slice方法对文件进行分割后进行分段读取,这也是本文接下来的重点。

注:本部分没有贴相关的实例代码,在网上用关键字可以搜到很多实例。

1.2 大文件分块读取以及断点续读的纯前端简易实现

首先看本部分最后实现的效果如下图:

大文件分块读取以及断点续读的关键在于文件分割和读取进度的保存,本文读取进度的保存采用浏览器的localstorage来实现,本部分的关键代码如下:

分块读取完成后的回调函数

读取过程中的停止与开始

本部分由于相对来说比较简单,根据上述代码就可以大体明白所有的逻辑,所以不做太多的叙述,详细的代码可以点击

2. 大文件分块上传的前后端完整实现

接下来是本文的重头戏,在这部分会看到更多的文字与代码介绍。

2.1 大文件分块上传一般思路

大文件分块上传的基本思路有以下几个步骤:

对文件内容进行MD5加密, MD5加密可以对文件进行唯一的标识, 也可以为后台进行文件完整性的校验进行比对

得到文件内容的MD5值后,首先向后台发起请求,判断当前文件是否已经上传,如果该文件已经上传过,则不再重复上传,这一点就是云盘等产品中秒传,秒传其实就是根据MD5值判断后台存储介质中已经有该文件了,只为当前用户建立一个引用或者软链即可

在上述第二步的请求中,如果当前文件没有上传过,则后台会进行判断是否上传过一部分,如果服务器上已经有部分临时分块,说明当前上传为续传,所以会给前端返回已经上传过的分块列表,本次上传只需要上传未上传过的分块即可,即:在上次断点处续传

对文件进行分块,假如一个大文件有100M,一个分块定义为1M,则分100次上传完成

根据第二三步中的返回来的已上传分块列表,对比出未上传的分块后将其上传(这里,每一个分块上传到服务器上都会形成一个临时文件)

当所有的分块上传成功后,发起合并请求,将所有临时分块合并为完整的文件

2.2 本实现基本后端服务

下面会对应上边的步骤逐一叙述每一部分的前后端实现,在具体叙述之前,首先提一下本实现所使用的后端情况。本实现的后端服务采用Koa + Koa-Router实现,由于本实现中对应异步处理采用了ES7中的async/await,所有加上了对ES新特性的babel转换,具体代码如下:

本部分的babel转换需要的模块为:

2.3 大文件分块上传前后端详细介绍

本小节开始按照第一小节的步骤详细介绍分块上传的前后端实现。

获取文件内容的MD5值

将文件按照设定分块大小进行分段读取,采用SparkMD5来获取文件内容的MD5,代码实现如下:

根据MD5值发起请求,并判断当前文件是否已被上传,如果已经被上传,则返回结果;如果未被上传,则返回已上传的分块列表数组,如果一块都没有传过,则返回一个空数组。

本部分的前端只是发起请求:

对应的后端接口服务根据传过来的文件名和文件MD5值,去做出相关判断

根据上边请求的返回结果,可以得到当前文件是否传过,如果服务器中已经有了一份MD5值相同的文件,则秒传成功;如果没有,则获得了当前已传分块的列表,只需要对未传分块进行上传即可。

上一步中检查分块上传后调用了uploadChunk方法来进行分块上传,分块上传在前端主要为:根据已上传文件列表情况对文件进行分割,将分割后的分块上传。其中用到了HTML5的FormData新特性,采用FormData可以在程序中直接向表单一样的去操作数据。

在后端接口中,重点在于把分块文件从源路径拷贝到目的路径下,这里涉及到Node中的fs模块和child_process模块,本来应该使用fs模块可以完全实现,但是在实现过程中遇到了一些不明白的坑,不得已最后采用了child_process来执行shell命令完成了功能的实现。

在后端中,首先声明了一个文件夹变量,将所有的临时文件都存在该文件夹中的以文件md5值命名的子文件夹中,有点绕口,写出来就是临时文件存在了__dirname/uploads/77aef65d958b34b2edaf中,在新建文件夹过程中可能会遇到权限问题,本实现在新建时将文件夹权限提前设置为777,以方便读写操作。

当所有的分块上传后,则前端可以发起合并临时文件的请求,后端收到请求后将特定目录中的临时文件合并为目标文件。合并操作可以通过fs模块的writeStream和readStream方法,本实现直接使用第三方模块concat-file。

到此完整的大文件分块上传已全部实现,在上述后端接口中,调用的一些比如判断路径、拷贝文件、合并文件等都单独抽出来一个utils.js的文件,这里只列举一个工具函数,其余的可以在源代码中查看,猛戳

//判断文件或者文件夹是否存在

//判断文件或者文件夹是否存在

本实现的最后成果如下图展示:

为了展示分块和续传,在上个结果之后,删除掉了合并后的文件和其中部分临时文件,然后重新上传,结果如下:

还是一句老话,生命在于折腾,周末昏天暗地的码了一天也算是比较完整的实现了可以称为解决方案的东东。在整个实现中也踩了不少的坑,最大的坑就是对于异步处理的控制,刚开始几次对于async/await的使用总是忘记,导致后端明明已经收到了请求,但是前端还是404 。完成一篇博文越来越感觉到不容易,如果走心的完成更是不容易,虽然是对自己学习和工作的记录,但是也得付出200%的用心。在整个实现过程中,《童年的回忆》钢琴曲被我玩坏了,这也是我一直以来最喜欢的曲子,摆出来和大家一起欣赏。

如果您觉得这篇文章对您有帮助,就给楼主点支持与鼓励吧!

长按识别或者微信扫码,打赏作者吧~

}

《编写c语言程序:求分段函数》由会员分享,可在线阅读,更多相关《编写c语言程序:求分段函数(1页珍藏版)》请在人人文库网上搜索。

}

我要回帖

更多关于 用c语言写分段函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信