网站建设开发方式包括一l丫wordpress 问答平台
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:47
当前位置: 首页 > news >正文
网站建设开发方式包括一l丫,wordpress 问答平台,网页版崩坏星穹铁道,wordpress 发卡标准IO
标准 I/O 虽然是对文件 I/O 进行了封装#xff0c;但事实上并不仅仅只是如此#xff0c;标准 I/O 会处理很多细节#xff0c;譬如分配 stdio 缓冲区、以优化的块长度执行 I/O 等#xff0c;这些处理使用户不必担心如何选择使用正确的块长度。I/O 库函数是构建于文件…标准IO
标准 I/O 虽然是对文件 I/O 进行了封装但事实上并不仅仅只是如此标准 I/O 会处理很多细节譬如分配 stdio 缓冲区、以优化的块长度执行 I/O 等这些处理使用户不必担心如何选择使用正确的块长度。I/O 库函数是构建于文件 I/Oopen()、 read()、 write()、 lseek()、 close()等这些系统调用之上的譬如标准 I/O 库函数 fopen()就利用系统调用 open()来执行打开文件的操作、 fread()利用系统调用 read()来执行读文件操作、 fwrite()则利用系统调用 write()来执行写文件操作等等。那既然如此为何还需要设计标准 I/O 库直接使用文件 I/O 系统调用不是更好吗事实上并非如此 在第一章中我们也提到过设计库函数是为了提供比底层系统调用更为方便、好用的调用接口 虽然标准 I/O 构建于文件 I/O 之上 但标准 I/O 却有它自己的优势标准 I/O 和文件 I/O 的区别如下
虽然标准 I/O 和文件 I/O 都是 C 语言函数但是标准 I/O 是标准 C 库函数而文件 I/O 则是 Linux系统调用
标准 I/O 是由文件 I/O 封装而来标准 I/O 内部实际上是调用文件 I/O 来完成实际操作的 可移植性标准 I/O 相比于文件 I/O 具有更好的可移植性通常对于不同的操作系统其内核向应用层提供的系统调用往往都是不同譬如系统调用的定义、功能、参数列表、返回值等往往都是不一样的而对于标准 I/O 来说由于很多操作系统都实现了标准 I/O 库标准 I/O 库在不同的操作系统之间其接口定义几乎是一样的所以标准 I/O 在不同操作系统之间相比于文件 I/O 具有更好的可移植性。 性能、效率 标准 I/O 库在用户空间维护了自己的 stdio 缓冲区 所以标准 I/O 是带有缓存的而文件 I/O 在用户空间是不带有缓存的所以在性能、效率上标准 I/O 要优于文件 I/O。
对于标准 I/O 库函数来说它们的操作是围绕 FILE 指针进行的当使用标准 I/O 库函数打开或创建一个文件时会返回一个指向 FILE 类型对象的指针FILE * 使用该 FILE 指针与被打开或创建的文件相关联然后该 FILE 指针就用于后续的标准 I/O 操作使用标准 I/O 库函数进行 I/O 操作所以由此可知FILE 指针的作用相当于文件描述符只不过 FILE 指针用于标准 I/O 库函数中、而文件描述符则用于文件I/O 系统调用中。FILE 是一个结构体数据类型它包含了标准 I/O 库函数为管理文件所需要的所有信息包括用于实际I/O 的文件描述符、指向文件缓冲区的指针、缓冲区的长度、当前缓冲区中的字节数以及出错标志等。 FILE数据结构定义在标准 I/O 库函数头文件 stdio.h 中。
所谓标准输入设备指的就是计算机系统的标准的输入设备通常指的是计算机所连接的键盘而标准输出设备指的是计算机系统中用于输出标准信息的设备通常指的是计算机所连接的显示器标准错误设备则指的是计算机系统中用于显示错误信息的设备通常也指的是显示器设备。
用户通过标准输入设备与系统进行交互 进程将从标准输入stdin文件中得到输入数据将正常输出数据譬如程序中 printf 打印输出的字符串 输出到标准输出stdout 文件而将错误信息譬如函数调用报错打印的信息输出到标准错误stderr 文件。标准输出文件和标准错误文件都对应终端的屏幕而标准输入文件则对应于键盘。每个进程启动之后都会默认打开标准输入、标准输出以及标准错误 得到三个文件描述符 即 0、 1、2 其中 0 代表标准输入、 1 代表标准输出、 2 代表标准错误
在应用编程中可以使用宏 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 分别代表 0、 1、 2这些宏定义在 unistd.h 头文件中
/* Standard file descriptors. /
#define STDIN_FILENO 0 / Standard input. /
#define STDOUT_FILENO1 / Standard output. /
#define STDERR_FILENO2 / Standard error output. /
0、 1、 2 这三个是文件描述符只能用于文件 I/Oread()、 write()等那么在标准 I/O 中自然是无法使用文件描述符来对文件进行 I/O 操作的它们需要围绕 FILE 类型指针来进行在 stdio.h 头文件中有相应的定义如下
/ Standard streams. */
extern struct _IO_FILE stdin; / Standard input stream. */
extern struct _IO_FILE stdout; / Standard output stream. */
extern struct _IO_FILE stderr; / Standard error output stream. /
/ C89/C99 say theyre macros. Make them happy. */
#define stdin stdin
#define stdout stdou
t#define stderr stderr Tips struct _IO_FILE 结构体就是 FILE 结构体使用了 typedef 进行了重命名。所以在标准 I/O 中可以使用 stdin、 stdout、 stderr 来表示标准输入、标准输出和标准错误。 用库函数fopen()打开或创建文件 fopen()函数原型如下所示
#include stdio.h
FILE *fopen(const char *path, const char *mode);
使用该函数需要包含头文件 stdio.h。函数参数和返回值含义如下 path 参数 path 指向文件路径可以是绝对路径、也可以是相对路径。 mode 参数 mode 指定了对该文件的读写权限是一个字符串稍后介绍。 返回值 调用成功返回一个指向 FILE 类型对象的指针FILE *该指针与打开或创建的文件相关联后续的标准 I/O 操作将围绕 FILE 指针进行。 如果失败则返回 NULL并设置 errno 以指示错误原因。参数 mode 字符串类型可取值为如下值之一 mode说明flags 参数取值r以只读方式打开文件。O_RDONLYr以可读、可写方式打开文件。O_RDWRw以只写方式打开文件如果文件存在将文件长度截断为0如果文件不存在则创建文件。O_WRONLY | O_CREAT | O_TRUNCw以可读、可写方式打开文件如果文件存在将文件长度截断为0如果文件不存在则创建文件。O_RDWR |O_CREAT O_TRUNC a以只写方式打开文件进行追加内容在文件末尾写入如果文件不存在则创建文件。O_WRONLY | O_CREAT | O_APPENDa以可读、可写方式打开文件进行追加内容在文件末尾写入如果文件不存在则创建文件。O_RDWR | O_CREAT | O_APPEND
读文件和写文件
当使用 fopen()库函数打开文件之后接着我们便可以使用 fread()和 fwrite()库函数对文件进行读、写操作了函数原型如下所示
#include stdio.h
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
库函数 fread()用于读取文件数据其参数和返回值含义如下 ptr fread()将读取到的数据存放在参数 ptr 指向的缓冲区中 size fread()从文件读取 nmemb 个数据项每一个数据项的大小为 size 个字节所以总共读取的数据大小为 nmemb * size 个字节。 nmemb 参数 nmemb 指定了读取数据项的个数。stream FILE 指针。 返回值 调用成功时返回读取到的数据项的数目数据项数目并不等于实际读取的字节数除非参数size 等于 1如果发生错误或到达文件末尾则 fread()返回的值将小于参数 nmemb那么到底发生了错误还是到达了文件末尾 fread()不能区分文件结尾和错误 究竟是哪一种情况此时可以使用 ferror()或 feof()函数来判断
库函数 fwrite()用于将数据写入到文件中其参数和返回值含义如下 ptr 将参数 ptr 指向的缓冲区中的数据写入到文件中。 size 参数 size 指定了每个数据项的字节大小与 fread()函数的 size 参数意义相同。 nmemb 参数 nmemb 指定了写入的数据项个数与 fread()函数的 nmemb 参数意义相同。stream FILE 指针。 返回值 调用成功时返回写入的数据项的数目数据项数目并不等于实际写入的字节数除非参数 size等于 1如果发生错误则 fwrite()返回的值将小于参数 nmemb或者等于 0。
由此可知库函数 fread()、 fwrite()中指定读取或写入数据大小的方式与系统调用 read()、 write()不同前者通过 nmemb数据项个数 *size每个数据项的大小的方式来指定数据大小而后者则直接通过一个 size 参数指定数据大小。譬如要将一个 struct mystr 结构体数据写入到文件中: 可按如下方式写入fwrite(buf, sizeof(struct mystr), 1, file); 当然也可以按如下方式写fwrite(buf, 1, sizeof(struct mystr), file);
库函数 fseek()的作用类似于系统调用 lseek() 用于设置文件读写位置偏移量 lseek()用于文件 I/O而库函数 fseek()则用于标准 I/O其函数原型如下所示
#include stdio.hint fseek(FILE *stream, long offset, int whence);
函数参数和返回值含义如下 stream FILE 指针。 offset 与 lseek()函数的 offset 参数意义相同。 whence 与 lseek()函数的 whence 参数意义相同。 返回值 成功返回 0发生错误将返回-1并且会设置 errno 以指示错误原因 与 lseek()函数的返回值意义不同这里要注意调用库函数 fread()、 fwrite()读写文件时文件的读写位置偏移量会自动递增使用 fseek()可手动设置文件当前的读写位置偏移量。 譬如将文件的读写位置移动到文件开头处fseek(file, 0, SEEK_SET); 将文件的读写位置移动到文件末尾fseek(file, 0, SEEK_END); 将文件的读写位置移动到 100 个字节偏移量处fseek(file, 100, SEEK_SET);
调用 fread()读取数据时如果返回值小于参数 nmemb 所指定的值表示发生了错误或者已经到了文件末尾文件结束 end-of-file但 fread()无法具体确定是哪一种情况 在这种情况下可以通过判断错误标志或 end-of-file 标志来确定具体的情况。feof()函数库函数 feof()用于测试参数 stream 所指文件的 end-of-file 标志如果 end-of-file 标志被设置了则调用feof()函数将返回一个非零值如果 end-of-file 标志没有被设置则返回 0。
#include stdio.h
int feof(FILE *stream);
当文件的读写位置移动到了文件末尾时 end-of-file 标志将会被设置。库函数 ferror()用于测试参数 stream 所指文件的错误标志如果错误标志被设置了则调用 ferror()函数将返回一个非零值如果错误标志没有被设置则返回 0。其函数原型如下所示
#include stdio.h
int ferror(FILE *stream);
C 库函数提供了 5 个格式化输出函数包括 printf()、 fprintf()、 dprintf()、 sprintf()、 snprintf()其函数定义如下所示
#include stdio.h
int printf(const char *format, …);
int fprintf(FILE *stream, const char *format, …);
int dprintf(int fd, const char *format, …);
int sprintf(char *buf, const char *format, …);
int snprintf(char *buf, size_t size, const char *format, …)
这 5 个函数都是可变参函数它们都有一个共同的参数 format这是一个字符串称为格式控制字符串用于指定后续的参数如何进行格式转换 所以才把这些函数称为格式化输出因为它们可以以调用者指定的格式进行转换输出 学习这些函数的重点就是掌握这个格式控制字符串 format 的书写格式以及它们所代表的意义 每个函数除了固定参数之外还可携带 0 个或多个可变参数。printf()函数
用于将格式化数据写入到标准输出 dprintf()和 fprintf()函数用于将格式化数据写入到指定的文件中两者不同之处在于 fprintf()使用 FILE 指针指定对应的文件、而 dprintf()则使用文件描述符 fd 指定对应的文件 sprintf()、 snprintf()函数可将格式化的数据存储在用户指定的缓冲区 buf 中。printf()函数前面章节内容编写的示例代码中多次使用了该函数用于将程序中的字符串信息输出显示到终端也就是标准输出它是一个可变参函数除了一个固定参数 format外后面还可携带 0 个或多个参数。函数调用成功返回打印输出的字符数失败将返回一个负值打印“Hello World”printf(Hello World!\n);打印数字 5printf(%d\n, 5);
fprintf()可将格式化数据写入到由 FILE 指针指定的文件中譬如将字符串“Hello World”写入到标准错误fprintf(stderr, Hello World!\n);向标准错误写入数字 5fprintf(stderr, %d\n, 5);函数调用成功返回写入到文件中的字符数失败将返回一个负值
dprintf()可将格式化数据写入到由文件描述符 fd 指定的文件中譬如将字符串“Hello World”写入到标准错误dprintf(STDERR_FILENO, Hello World!\n);向标准错误写入数字 5dprintf(STDERR_FILENO, %d\n, 5);函数调用成功返回写入到文件中的字符数失败将返回一个负值
sprintf()函数sprintf()函数将格式化数据存储在由参数 buf 所指定的缓冲区中 譬如将字符串“Hello World”存放在缓冲区中
char buf[100];sprintf(buf, Hello World!\n);
当然这种用法并没有意义事实上我们一般会使用这个函数进行格式化转换并将转换后的字符串存放在缓冲区中譬如将数字 100 转换为字符串100将转换后得到的字符串存放在 buf 中
char buf[20] {0};
sprintf(buf, %d, 100);
sprintf()函数会在字符串尾端自动加上一个字符串终止字符\0。
需要注意的是 sprintf()函数可能会造成由参数 buf 指定的缓冲区溢出调用者有责任确保该缓冲区足够大因为缓冲区溢出会造成程序不稳定甚至安全隐患函数调用成功返回写入到 buf 中的字节数失败将返回一个负值snprintf()函数sprintf()函数可能会发生缓冲区溢出的问题存在安全隐患为了解决这个问题引入了 snprintf()函数在该函数中使用参数 size 显式的指定缓冲区的大小如果写入到缓冲区的字节数大于参数 size 指定的大小超出的部分将会被丢弃如果缓冲区空间足够大 snprintf()函数就会返回写入到缓冲区的字符数与sprintf()函数相同也会在字符串末尾自动添加终止字符\0。若发生错误 snprintf()将返回一个负值
以上 5 个函数中的 format 参数应该怎么写把这个参数称为格式控制字符串顾名思义首先它是一个字符串的形式其次它能够控制后续变参的格式转换。格式控制字符串由两部分组成普通字符非%字符 和转换说明。普通字符会进行原样输出每个转换说明都会对应后续的一个参数通常有几个转换说明就需要提供几个参数除固定参数之外的参数 使之一一对应用于控制对应的参数如何进行转换。如下所示printf(转换说明 1 转换说明 2 转换说明 3, arg1, arg2, arg3);这里只是以 printf()函数举个例子实际上并不这样用。三个转换说明与参数进行一一对应按照顺序方式一一对应。每个转换说明都是以%字符开头其格式如下所示使用[ ]括起来的部分是可选的
%[flags][width][.precision][length]type flags 标志可包含 0 个或多个标志 width 输出最小宽度表示转换后输出字符串的最小宽度precision 精度前面有一个点号 . length 长度修饰符 type 转换类型指定待转换数据的类型。 可以看到只有%和 type 字段是必须的其余都是可选的。
首先说明 type类型 因为类型是格式控制字符串的重中之重是必不可少的组成部分其它的字段都是可选的 type 用于指定输出数据的类型 type 字段使用一个字符字母字符来表示:
字符对应数据类型含义示例说明d/iint输出有符号十进制表示的整数i 是老式写法printf(%d\n, 123); 输出: 123ounsigned int输出无符号八进制表示的整数默认不输出前缀0可在 # 标志下输出前缀0printf(%o\n, 123); 输出: 173uunsigned int输出无符号十进制表示的整数printf(%u\n, 123); 输出: 123x/Xunsigned int输出无符号十六进制表示的整数x 和 X 区别在于字母大小写printf(%x\n, 123); 输出: 7b printf(%X\n, 123); 输出: 7Bf/Fdouble输出浮点数f 和 F 区别在于字母大小写默认保留小数点后 6 位数printf(%f\n, 520.1314); 输出: 520.131400 printf(%F\n, 520.1314); 输出: 520.131400e/Edouble输出以科学计数法表示的浮点数e 和 E 区别在于字母大小写printf(%e\n, 520.1314); 输出: 5.201314e02 printf(%E\n, 520.1314); 输出: 5.201314E02gdouble根据数值的长度选择以最短方式输出%f/%eprintf(%g %g\n, 0.000000123, 0.123); 输出: 1.23e-07 0.123Gdouble根据数值的长度选择以最短方式输出%F/%Eprintf(%G %G\n, 0.000000123, 0.123); 输出: 1.23E-07 0.123schar *字符串输出字符串中的字符直到终止字符 \0printf(%s\n, Hello World); 输出: Hello Worldpvoid *输出十六进制表示的指针printf(%p\n, Hello World); 输出: 0x400624cchar字符型将输入的数字转换为对应的 ASCII 字符输出printf(%c\n, 64); 输出: A
flags字段的含义如下
字符名称作用#井号对于 o 类型输出字符串增加前缀 0对于 x 或 X 类型输出前缀 0x 或 0X。对于浮点数类型强制输出小数点。0数字 0当输出数字非 c 或 s 类型时在输出前补 0直到达到指定最小宽度。-减号左对齐输出若宽度不足则在右边填充空格。若同时指定 0 和 – 会覆盖 0。 空格输出正数时在数字前加一个空格负数则加负号 -。加号输出时无论正数还是负数前面都带符号。正数带 负数带 -。 会覆盖 空格。
宽度类型描述示例数字指定输出的最小宽度若实际输出位数小于指定宽度前面会补充空格或 0。printf(%06d, 1000); 输出: 001000*不显示宽度数值宽度由参数列表中的值指定。printf(%0*d, 6, 1000); 输出: 001000
描述类型示例数字整型d, i, o, u, x, X对于整型指定输出的最小数字位数不足时补前导零。 例如 printf(%8.5d, 100); 输出: 00100浮点型a, A, e, E, f, F对于浮点数指定小数点后数字的个数。默认6位。 例如 printf(%.8f, 520.1314); 输出: 520.13140000g, G对于 g 和 G表示最大有效数字位数。字符串s指定最大输出字符数超过则截断。 例如 printf(%.5s, hello world); 输出: hello*星号精度由参数列表指定例如 printf(%.*s, 5, hello world); 输出: hello
长度修饰符指明待转换数据的长度因为 type 字段指定的的类型只有 int、unsigned int 以及 double 等几种数据类型但是C 语言内置的数据类型不止这几种譬如有 16bit 的 short、unsigned short8bit 的char、unsigned char也有64bit 的 long long 等为了能够区别不同长度的数据类型于是乎长度修饰符length应运而生成为转换说明的一部分。 length 长度修饰符也是使用字符字母字符来表示结合type 字段以确定不同长度的数据类型
typelength描述d, inoneint 类型输出有符号十进制整数。u, o, x, Xnoneunsigned int 类型输出无符号十进制、八进制、十六进制整数。f, F, e, E, g, Gnonedouble 类型输出浮点数使用小数表示或科学计数法。cnonechar 类型输出一个字符。snonechar * 类型输出字符串。pnonevoid * 类型输出指针的十六进制表示。hhsigned char, unsigned charsigned char 或 unsigned char 类型输出字符。hshort int, unsigned short intshort int 或 unsigned short int 类型输出整数。llong int, unsigned long intlong int 或 unsigned long int 类型输出整数。wint_twchar_t宽字符类型wint_t 或 wchar_t用于宽字符处理。lllong long int, unsigned long long intlong long int 或 unsigned long long int 类型输出整数。Llong doublelong double 类型输出浮点数。jintmax_t, uintmax_tintmax_t 或 uintmax_t 类型输出整数。zsize_t, ssize_tsize_t 或 ssize_t 类型输出无符号或有符号整数。tptrdiff_tptrdiff_t 类型表示指针差值。
格式化输入是类似的这里不加以赘述了。
- 上一篇: 网站建设开发方案seo综合查询怎么关闭
- 下一篇: 网站建设开发方式包括一l丫洛阳做网站的
相关文章
-
网站建设开发方案seo综合查询怎么关闭
网站建设开发方案seo综合查询怎么关闭
- 技术栈
- 2026年03月21日
-
网站建设具体运算做触屏网站
网站建设具体运算做触屏网站
- 技术栈
- 2026年03月21日
-
网站建设具体要求wordpress centos
网站建设具体要求wordpress centos
- 技术栈
- 2026年03月21日
-
网站建设开发方式包括一l丫洛阳做网站的
网站建设开发方式包括一l丫洛阳做网站的
- 技术栈
- 2026年03月21日
-
网站建设开发费用入什么科目滦平住房和城乡建设厅网站
网站建设开发费用入什么科目滦平住房和城乡建设厅网站
- 技术栈
- 2026年03月21日
-
网站建设开发感悟前几年做那个网站能致富
网站建设开发感悟前几年做那个网站能致富
- 技术栈
- 2026年03月21日
