<4D F736F F D20B5DA31D5C220C7B6C8EBCABDD3A6D3C3B3CCD0F2C9E8BCC6D7DBBACFBDCCB3CC2E646F63>

Similar documents
C/C++ - 文件IO

C

附錄C.doc

プログラムの設計と実現II

新版 明解C言語入門編

新・明解C言語入門編『索引』

新・解きながら学ぶC言語

第7章 数组

文件

epub 33-8

Microsoft PowerPoint - 07_IO.ppt

chap12.ppt

第3章 类型、运算符与表达式

Microsoft PowerPoint - 01_Introduction.ppt

PowerPoint 演示文稿

_汪_文前新ok[3.1].doc

C 1

Microsoft PowerPoint - w22

没有幻灯片标题

实际问题 : 1 职工信息管理系统 2 学生选课系统 3 飞机订票系统 4 图书信息管理系统 5 图象处理

从问题到程序——文件及输入输出

C/C++ - 字符串与字符串函数

C/C++ - 函数

1. SDK 概述 Arcsoft Photo Styling SDK 可以将输入图像转化为具有指定风格的图像 图像风格主要是指色调 笔触 线条等图像的特异性表现形式 存储某一艺术图像风格模板的文件将按需要发布给 SDK 使用者 借助 SDK 和风格模板文件, 用户可以开发图像风格化等图像美化类应用

<4D F736F F D20B5DA33D5C220CAFDBEDDB5C4CAE4C8EBCAE4B3F62E646F63>

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

,,,,,,,,,, ( http: \ \ www. ncre. cn,, ) 30,,,,,,,, C : C : : 19 : : : /16 : : 96 : : : ISBN 7

Microsoft Word - chap13.doc

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

untitled

第十一章 文件和数据的导入与导出

Microsoft Word - CPE考生使用手冊 docx

11. 下列关于文件的结论中正确的是 ( ) A. 对文件操作必须先关闭文件 B. 对文件操作必须先打开文件 C. 对文件的操作顺序没有统一规定 D. 以上三种答案全是错误的 12. 若以 a+ 方式打开一个已存在的文件, 则以下叙述正确的是 ( ) A. 文件打开时, 原有文件内容不被删除, 位置

10 系统级 I/O 2017 年 4 月 5 日 9: 输入 / 输出 (I/O) 是在主存和外部设备之间拷贝数据的过程 输入是从 I/O 设备拷贝数据到主存, 输出是从主存拷贝数据到 I/O 设备 了解 I/O 的好处 : a. 帮助理解其它的系统概念 ; b. 有时候除了使用

Microsoft PowerPoint - C-Ch12.ppt

ebook15-C

C/C++ 语言 - 循环

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

嵌入式Linux开发课程

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

[改訂新版]C言語による標準アルゴリズム事典

CC213

1

untitled

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

C/C++ Basics

nooog

Microsoft Word 职称安排修改 于.docx

C/C++ Programming

untitled

Microsoft PowerPoint - 20-string-s.pptx

Guava学习之Resources

C/C++程序设计 - 字符串与格式化输入/输出

Ps22Pdf

C/C++ - 字符输入输出和字符确认

Microsoft Word - 考试大纲 (2)

C


提纲 1 2 OS Examples for 3


CC213

Microsoft PowerPoint - CPP-Ch Print.ppt [兼容模式]

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

ebook35-21

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ

Microsoft Word - 第2章 Linux文件IO编程.doc

《计算概论》课程 第十九讲 C 程序设计语言应用

C程序设计语言

ebook15-2

FY.DOC

<4D F736F F D20B5DA32D5C220416E64726F6964BFAAB7A2BBB7BEB3B4EEBDA82E646F6378>

C++ 程式設計

C/C++ - 数组与指针

IO

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

untitled

上海市教育考试院关于印发新修订的

ebook15-10

技 术 文 件

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

ebook15-4

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

《C语言程序设计》教材习题参考答案

Zookeeper使用ACL进行访问权限控制

谨将我们的工作献给 即将毕业离校的兄弟们 林晓鑫 刘德超 黄巍 周蓝珺 胡禹轩 王新喜 何春晓 崔剑 李浩 以及 潘海东即将出世的小 Baby! II

C C

Linux快速入门

新版 明解C++入門編

并行计算

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

液晶之家论坛-

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

图 4.2 udpclient 项目解决方案 3. 客户机程序编码如下 : 程序 : udp 客户机程序 udpclient.cpp

使用方法 :hadoop fs -chmod [-R] <MODE[,MODE]... OCTALMODE> URI [URI ] 改变文件的权限 使用 -R 将使改变在目录结构下递归进行 命令的使用者必须是文件的所有者或者超级用户 更多的信息请参见 HDFS 权限用户指南 chown 使用方法 :

Guava学习之CharSequenceReader

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09: 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

迅速在两个含有大量数据的文件中寻找相同的数据

Transcription:

嵌入式应用程序设计综合教程作者 : 华清远见 第 1 章 Linux 标准 I/O 编程 本章目标 在应用开发中经常要访问文件 Linux 下读写文件的方式有两大类 : 标准 I/O 和文件 I/O 其中标准 I/O 是最常用也是最基本的内容, 希望读者好好掌握 本章主要内容 : Linux 系统调用和用户编程接口 (API); Linux 标准 I/O 概述 ; 标准 I/O 操作

1.1 Linux 系统调用和用户编程接口 1.1.1 系统调用 操作系统负责管理和分配所有的计算机资源 为了更好地服务于应用程序, 操作系统提供了一组特殊接口 系统调用 通过这组接口用户程序可以使用操作系统内核提供的各种功能 例如分配内存 创建进程 实现进程之间的通信等 为什么不允许程序直接访问计算机资源? 答案是不安全 单片机开发中, 由于不需要操作系统, 所以开发人员可以编写代码直接访问硬件 而在 32 位嵌入式系统中通常都要运行操作系统, 程序访问资源的方式就发生了改变 操作系统基本上都支持多任务, 即同时可以运行多个程序 如果允许程序直接访问系统资源, 肯定会带来很多问题 因此, 所有软硬件资源的管理和分配都由操作系统负责 程序要获取资源 ( 如分配内存, 读写串口 ) 必须通过操作系统来完成, 即用户程序向操作系统发出服务请求, 操作系统收到请求后执行相关的代码来处理 用户程序向操作系统提出请求的接口就是系统调用 所有的操作系统都会提供系统调用接口, 只不过不同的操作系统提供的系统调用接口各不相同 Linux 系统调用接口非常精简, 它继承了 UNIX 系统调用中最基本和最有用的部分 这些系统调用按照功能大致可分为进程控制 进程间通信 文件系统控制 存储管理 网络管理 套接字控制 用户管理等几类 1.1.2 用户编程接口 前面提到利用系统调用接口程序可以访问各种资源, 但在实际开发中程序并不直接使用系统调用接口, 而是使用用户编程接口 (API) 为什么不直接使用系统调用接口呢? 原因如下 (1) 系统调用接口功能非常简单, 无法满足程序的需求 (2) 不同操作系统的系统调用接口不兼容, 程序移植时工作量大 用户编程接口通俗的解释就是各种库 ( 最重要的就是 C 库 ) 中的函数 为了提高开发效率,C 库中实现了很多函数 这些函数实现了常用的功能, 供程序员调用 这样一来, 程序员不需要自己编写这些代码, 直接调用库函数就可以实现基本功能, 提高了代码的复用率 使用用户编程接口还有一个好处 : 程序具有良好的可移植行 几乎所有的操作系统上都实现了 C 库, 所以程序通常只需要重新编译一下就可以在其他操作系统下运行 用户编程接口 (API) 在实现时, 通常都要依赖系统调用接口 例如, 创建进程的 A PI 函数 fork() 对应于内核空间的 sys_fork() 系统调用 很多 API 函数需要通过多个系统调用来完成其功能 还有一些 API 函数不需要调用任何系统调用 在 Linux 中用户编程接口 (API) 遵循了在 UNIX 中最流行的应用编程界面标准 POSIX 标准 POSIX 标准是由 IEEE 和 ISO/IEC 共同开发的标准系统 该标准基于当时现有的 UNIX 实践和经验, 描述了操作系统的系统调用编程接口 ( 实际上就是 API), 用于保证应用程序可以在源代码一级上在多种操作系统上移植运行 这些系统调用编程接口主要是通过 C 库 (libc) 实现的 1.2 Linux 标准 I/O 概述 1.2.1 标准 I/O 的由来 标准 I/O 指的是 ANSI C 中定义的用于 I/O 操作的一系列函数 2

只要操作系统中安装了 C 库, 标准 I/O 函数就可以调用 换句话说, 如果程序中使用的是标准 I/O 函数, 那么源代码不需要修改就可以在其他操作系统下编译运行, 具有更好的可移植性 除此之外, 使用标准 I/O 可以减少系统调用的次数, 提高系统效率 标准 I/O 函数在执行时也会用到系统调用 在执行系统调用时,Linux 必须从用户态切换到内核态, 处理相应的请求, 然后再返回到用户态 如果频繁地执行系统调用会增加系统的开销 为了避免这种情况, 标准 I/O 使用时在用户空间创建缓冲区, 读写时先操作缓冲区, 在合适的时机再通过系统调用访问实际的文件, 从而减少了使用系统调用的次数 1.2.2 流的含义 标准 I/O 的核心对象就是流 当用标准 I/O 打开一个文件时, 就会创建一个 FILE 结构体描述该文件 ( 或者理解为创建一个 FILE 结构体和实际打开的文件关联起来 ) 我们把这个 FILE 结构体形象地称为流 标准 I/O 函数都基于流进行各种操作 标准 I/O 中的流的缓冲类型有以下三种 (1) 全缓冲 : 在这种情况下, 当填满标准 I/O 缓冲区后才进行实际 I/O 操作 对于存放在磁盘上的普通文件用标准 I/O 打开时默认是全缓冲的 当缓冲区已满或执行 flush 操作时才会进行磁盘操作 (2) 行缓冲 : 在这种情况下, 当在输入和输出中遇到换行符时执行 I/O 操作 标准输入流和标准输出流就是使用行缓冲的典型例子 (3) 无缓冲 : 不对 I/O 操作进行缓冲, 即在对流的读写时会立刻操作实际的文件 标准出错流是不带缓冲的, 这就使得出错信息可以立刻显示在终端上, 而不管输出的内容是否包含换行符 在下面讨论具体函数时, 请读者注意区分以上的 3 种不同情况 1.3 标准 I/O 编程 本节所要讨论的 I/O 操作都是基于流的, 它符合 ANSI C 的标准 有一些函数读者已经非常熟悉了 ( 如 printf() scantf() 函数等 ), 因此本节中仅介绍最常用的函数 1.3.1 流的打开 使用标准 I/O 打开文件的函数有 fopen() fdopen() 和 freopen() 它们可以以不同的模式打开文件, 都返回一个指向 FILE 的指针, 该指针指向对应的 I/O 流 此后, 对文件的读写都是通过这个 FILE 指针来进行 其中 fopen() 可以指定打开文件的路径和模式,fdopen() 可以指定打开的文件描述符和模式, 而 freopen() 除可指定打开的文件 模式外, 还可指定特定的 I/O 流 fopen() 函数格式如表 1.1 所示 表 1.1 fopen() 函数语法要点 FILE * fopen(const char * path, const char * mode); path: 包含要打开的文件路径及文件名 mode: 文件打开方式, 详细信息参考表 1.2 成功 : 指向 FILE 的指针失败 :NULL 其中,mode 用于指定打开文件的方式 表 1.2 说明了 fopen() 中 mode 的各种取值 3

表 1.2 r 或 rb r+ 或 r+b w 或 wb w+ 或 w+b a 或 ab a+ 或 a+b mode 取值说明 打开只读文件, 该文件必须存在打开可读写的文件, 该文件必须存在 打开只写文件, 若文件存在则文件长度为 0, 即会擦写文件以前的内容 ; 若文件不存在则建立该文件 打开可读写文件, 若文件存在则文件长度为 0, 即会擦写文件以前的内容 ; 若文件不存在则建立该文件 以附加的方式打开只写文件 若文件不存在, 则会建立该文件 ; 如果文件存在, 写入的数据会被加到文件尾, 即文件原先的内容会被保留 以附加方式打开可读写的文件 若文件不存在, 则会建立该文件 ; 如果文件存在, 写入的数据会被加到文件尾后, 即文件原先的内容会被保留 注意 : 在每个选项中加入 b 字符用来告诉函数库打开的文件为二进制文件, 而非纯文本文件 不过在 Linux 系统中会忽略该符号 当用户程序运行时, 系统自动打开了三个流 : 标准输入流 stdin 标准输出流 stdout 和标准错误流 stderr stdin 用来从标准输入设备 ( 默认是键盘 ) 中读取输入内容 ;stdout 用来向标准输出设备 ( 默认是当前终端 ) 输出内容 ;stderr 用来向标准错误设备 ( 默认是当前终端 ) 输出错误信息 1.3.2 流的关闭 关闭流的函数为 fclose(), 该函数将流的缓冲区内的数据全部写入文件中, 并释放相关资源 fclose() 函数格式如表 1.3 所示 表 1.3 fclose() 函数语法要点 int fclose(file * stream); stream: 已打开的流指针成功 :0 程序结束时会自动关闭所有打开的流 1.3.3 错误处理 标准 I/O 函数执行时如果出现错误, 会把错误码保存在 errno 中 程序员可以通过相应的函数打印错误信息 错误处理相关函数 perror 如表 1.4 所示 表 1.4 perror() 函数语法要点 4

void perror(const char* s); s: 在标准错误流上输出的信息 无 int main() FILE *fp; // 定义流指针 if ((fp = fopen("1.txt", "r")) == NULL) // NULL 是系统定义的宏, 其值为 0 perror("fail to fopen"); // 输出错误信息 fclose(fp); 如果文件 1.txt 不存在, 程序执行时会打印如下信息 : fail to fopen: No such file or directory 错误处理相关函数 strerror 如表 1.5 所示 表 1.5 strerror() 函数语法要点 #include <string.h> #include <errno.h> char *strerror(int errnum); 错误码错误码对应的错误信息 int main() FILE *fp; if ((fp = fopen("1.txt", "r")) == NULL) printf("fail to fopen: %s\n", strerror(errno)); fclose(fp); 如果文件 1.txt 不存在, 程序执行时会打印如下信息 : fail to fopen: No such file or directory 1.3.4 流的读写 5

1. 按字符 ( 字节 ) 输入 / 输出 字符输入 / 输出函数一次仅读写一个字符 其中字符输入 / 输出函数如表 1.6 和表 1.7 所示 表 1.6 字符输入函数语法要点 int getc(file * stream); int fgetc(file * stream); int getchar(void); stream: 要输入的文件流 成功 : 读取的字符 getc() 和 fgetc () 从指定的流中读取一个字符 ( 节 ),getchar() 从 stdin 中读取一个字符 ( 节 ) 表 1.7 字符输出函数语法要点 int putc(int c, FILE * stream); int fputc(int c, FILE * stream); int putchar(int c); 成功 : 输出的字符 c putc() 和 fputc() 向指定的流输出一个字符 ( 节 ),putchar() 向 stdout 输出一个字符 ( 节 ) 下面这个实例结合 fputc() 和 fgetc(), 循环从标准输入读取任意个字符并将其中的数字输出到标准输出 /*fput.c*/ int main() int c; while ( 1 ) c = fgetc(stdin); // 从键盘读取一个字符 if ((c >= '0') && (c <= '9')) fputc(c, stdout); // 若输入的是数字, 输出 if (c == '\n') break; // 若遇到换行符, 跳出循环 运行结果如下 $./a.out abc98io#4/wm 984 6

2. 按行输入 / 输出 行输入 / 输出函数一次操作一行 其中行输入 / 输出函数如表 1.8 和表 1.9 所示 表 1.8 行输入函数语法要点 char * gets(char *s) char * fgets(char * s, int size, FILE * stream) s: 存放输入字符串的缓冲区首地址 size: 输入的字符串长度 stream: 对应的流 成功 :s 失败或到达文件末尾 :NULL gets 函数容易造成缓冲区溢出, 不推荐大家使用 fgets 从指定的流中读取一个字符串, 当遇到 \n 或读取了 size-1 个字符后返回 注意,fgets 不能保证每次都能读出一行 表 1.9 行输出函数语法要点 int puts(const char *s) int fputs(const char * s, FILE * stream) s: 存放输出字符串的缓冲区首地址 stream: 对应的流成功 :s 失败 :NULL 下面以 fgets() 为例计算一个文本文件的行数 /*fgets.c*/ #include <string.h> int main(int argc, char *argv[]) int line = 0; char buf[128]; FILE *fp; if (argc < 2) printf("usage : %s <file>\n", argv[0]); 7

if ((fp = fopen(argv[1], "r")) == NULL) perror("fail to fopen"); while(fgets(buf, 128, fp)!= NULL) if (buf[strlen(buf)-1] == '\n') line++; printf("the line of %s is %d\n", argv[1], line); 运行该程序, 结果如下 $./a.out test.txt The line of test.txt is 64 3. 以指定大小为单位读写文件在文件流被打开之后, 可对文件流按指定大小为单位进行读写操作 fread() 函数格式如表 1.10 所示 表 1.10 fread() 函数语法要点 size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream); ptr: 存放读入记录的缓冲区 size: 读取的每个记录的大小 nmemb: 读取的记录数 stream: 要读取的文件流成功 : 返回实际读取到的 nmemb 数目 fwrite() 函数格式如表 1.11 所示 表 1.11 fwrite() 函数语法要点 size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream); ptr: 存放写入记录的缓冲区 size: 写入的每个记录的大小 nmemb: 写入的记录数 stream: 要写入的文件流 8

成功 : 返回实际写入的 nmemb 数目 1.3.5 流的定位 每个打开的流内部都有一个当前读写位置 流在打开时, 当前读写位置为 0, 表示文件的开始位置 每读写一次后, 当前读写位置自动增加实际读写的大小 在读写流之间可先对流进行定位, 即移动到指定的位置再操作 流的定位相关函数如表 1.12 和表 1.13 所示 表 1.12 fseek 函数语法要点 int fseek(file * stream, long offset, int whence); stream: 要定位的文件流 offset : 相对于基准值的偏移量 whence: 基准值 SEEK_SET 代表文件起始位置 SEEK_END 代表文件结束位置 SEEK_CUR 代表文件当前读写位置成功 :0 表 1.13 ftell() 函数语法要点 long ftell( FILE * stream); stream: 要定位的文件流成功 : 返回当前读写位置 下面的例子获取一个文件的大小 /*ftell.c*/ int main(int argc, char *argv[]) FILE *fp; if (argc < 2) printf("usage : %s <file>\n", argv[0]); 9

if ((fp = fopen(argv[1], "r")) == NULL) perror("fail to fopen"); fseek(fp, 0, SEEK_END); printf("the size of %s is %ld\n", argv[1], ftell(fp)); 运行该程序, 结果如下 $./a.out test.txt The size of test.txt is 305 1.3.6 格式化输入输出 格式化输入 / 输出函数可以指定输入 / 输出的具体格式, 包括读者已经非常熟悉的 printf() scanf() 等函数 以下简要介绍它们的格式, 如表 1.14~ 表 1.15 所示 表 1.14 函数传入值 格式化输入函数 int scanf(const char *format, ); int fscanf(file *fp, const char *format, ); int sscanf(char *buf, const char *format, ); format: 输入的格式 fp: 作为输入的流 buf: 作为输入的缓冲区 成功 : 输出字符数 (sprintf 返回存入数组中的字符数 ) 表 1.15 格式化输出函数 int printf(const char *format, ); int fprintf(file *fp, const char *format, ); int sprintf(char *buf, const char *format, ); format: 输出的格式 函数参值 fp: 接收输出的流 buf: 接收输出的缓冲区 成功 : 输出字符数 (sprintf 返回存入数组中的字符数 ) 10

fprintf 和 sprintf 在应用开发中经常会使用, 建议读者查看其帮助信息掌握用法 1.4 实验内容 1.4.1 文件的复制 1. 实验目的通过实现文件的复制, 掌握流的基本操作 2. 实验内容在程序中分别打开源文件和目标文件 循环从源文件中读取内容并写入目标文件 3. 实验步骤 (1) 设计流程 检查参数 打开源文件 打开目标文件 循环读写文件 关闭文件 (2) 编写代码 /*mycopy.c*/ #include <errno.h> #define N 64 int main(int argc, char *argv[]) int n; char buf[n]; FILE *fps, *fpd; if (argc < 3) printf("usage : %s <src_file> <dst_file>\n", argv[0]); if ((fps = fopen(argv[1], "r")) == NULL) fprintf(stderr, "fail to fopen %s : %s\n", argv[1], strerror(errno)); if ((fpd = fopen(argv[2], "w")) == NULL) fprintf(stderr, "fail to fopen %s : %s\n", argv[2], strerror(errno)); fclose(fps); 11

while((n = fread(buf, 1, N, fps)) >= 0) fwrite(buf, 1, N, fpd); fclose(fps); fclose(fpd); 1.4.2 循环记录系统时间 1. 实验目的获取系统时间 在程序中延时 流的格式化输出 2. 实验内容程序中每隔一秒读取一次系统时间并写入文件 3. 实验步骤 (1) 设计流程 打开文件 获取系统时间 写入文件 延时 1s 返回第二步 ( 获取系统时间 ) (2) 编写代码 /*mycopy.c*/ #include <time.h> #include <unistd.h> #define N 64 int main(int argc, char *argv[]) int n; char buf[n]; FILE *fps; time_t t; if (argc < 2) printf("usage : %s <file>\n", argv[0]); if ((fp = fopen(argv[1], "w")) == NULL) perror("fail to fopen"); 12

while( 1 ) time(&t); // 获取系统时间 fprintf(fp, "%s\n", ctime(&t)); // 将秒数转换成本地时间并写入指定的流 sleep(1); // 延时 1s fclose(fp); 小结本章首先讲解了系统调用 用户函数接口和系统命令之间的联系和区别 接下来本章重点介绍了标准 I/O 的相关函数, 建议读者以流的概念为出发点理解标准 I/O 的特点, 并通过练习掌握标准 I/O 常用函数的用法 最后, 本章安排了两个实验, 分别是文件复制和记录系统时间, 希望读者认真分析代码 思考与练习 1. 系统调用和用户编程接口的联系和区别是什么? 2. 标准 I/O 有哪些特点? 3. 分别用字符方式和按行访问方式实现文件的复制 联系方式 集团官网 :www.hqyj.com 嵌入式学院 :www.embedu.org 移动互联网学院 :www.3g-edu.org 企业学院 :www.farsight.com.cn 物联网学院 :www.topsight.cn 研发中心 :dev.hqyj.com 集团总部地址 : 北京市海淀区西三旗悦秀路北京明园大学校内华清远见教育集团 全国免费咨询电话 :400-706-1880 双休日及节假日请致电值班手机 :15010390966 在线咨询 : 张老师 QQ(619366077), 王老师 QQ(2814652411), 杨老师 QQ(1462495461) 企业培训洽谈专线 :010-82600901 院校合作洽谈专线 :010-82600350, 在线咨询 :QQ(248856300) 13