系统调用I/O函数open,write,read,都是生成文件描述符,然后对文件描述符操作,比如:STDIN_FILENO,STDOUT_FILENO

标准I/O函数,则是由fopen,fgets,fputs,puts,gets,putc,getc,getchar,putchar,fprintf,fscanf等,生成文件指针,然后对文件指针操作,stdin,stdout

C语言的文件输入输出函数也是成对的,也就是说那些标准输入输出函数都有他的文件输入输出版本——fscanf和fprintf,fgets和fputs,getc和putc。

文件输入输出首先要使用的就是fopen(),他用来打开文件,然后对文件内容的读写就交给上面的几个函数处理。其函数原型为FILE * fopen(const char * path,const char * mode),第一个参数是一个字符串,即文件的路径,第二个参数指定文件的打开模式。常用的有:

"r"——打开文本文件,只读,该文件必须存在。

"w"——打开文本文件,可以写入新内容,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

"a"——打开文本文件,可以读取和写入。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

"r+"——打开可读写的文本文件,该文件必须存在。

"w+"——打开可读写的文本文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

"a+"——打开文本文件,可以读取和写入。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

fopen()返回一个文件指针,其他I/O函数调用这个参数。

fscanf()和fprintf()与scanf和printf()的工作方式相似。主要区别在于前两者需要在第一个参数来制定合适的文件,即fopen的返回的FILE指针。

例如我从一个文件读取数据,然后把数据写入另外一个文件中:

#include #include #include #define max 100

int main() {

char *r = "E:/workspace/trying.txt";

char *w = "E:/workspace/test.txt";

FILE *read, *write;

char temp[max];

//打开文件流

read = fopen(r, "r");

write = fopen(w, "w");

// fscanf遇到空格和回车就停止下来,所以虽然可以复制文件内容,但是格式会有错误

while (fscanf(read, "%s", temp) == 1) {// 读字符串不推荐

fprintf(write, "%s", temp);

printf("%s", temp);

}

// 关闭文件流

if (fclose(read) == 0) {

printf("\nClose successfully");

}

if (fclose(write) == 0) {

printf("\nClose successfully");

}

return 0;

}

getc()和putc()是getchar()和putchar()对应的文件I/O函数,还是上面的例子,用这两个函数的实现如下:

#include #include #include

int main() {

char *r = "E:/workspace/trying.txt";

char *w = "E:/workspace/test.txt";

FILE *read, *write;

int c;

//打开文件流

read = fopen(r, "r");

write = fopen(w, "w");

// 可以完整的从文件复制内容和格式(换行回车都会保存)

while ((c = getc(read)) != EOF) {// 一个一个的读取字符

putc(c, write);// 写入文件

putchar(c);// 输出控制台

}

// 关闭文件流

if (fclose(read) == 0) {

printf("\nClose successfully");

}

if (fclose(write) == 0) {

printf("\nClose successfully");

}

return 0;

}

fgets()和fputs()是gets()和puts()对应的文件I/O函数。

fgets()和gets()的区别在于:

1.他需要第二个参数来说明最大读入字符数(这样就不会出现溢出的情况了,比gets()安全了很多),如果这个参数为n,fgets()就会读取最多n-1个字符或是读完一个换行符位置,由这两者中最先满足的那个决定。

2.fgets()会把读到的换行符也存到字符串中,而不是像gets()那样丢弃。

3.fgets()需要第三个参数指定读哪一个文件,从键盘读取时可以用“stdin”作为参数。

fputs()和puts()的区别在于:

1.和puts不同,fputs不会自动添加换行符(所以fgets()和fputs()配合的恰到好处)。

2.fputs()需要第二个参数指定读哪一个文件,从控制台输出时可以用“stdout”作为参数。

也是上面读写文件的例子,用这两个函数的实现方式就是:

#include #include #include #define max 100

int main() {

char *r = "E:/workspace/trying.txt";

char *w = "E:/workspace/test.txt";

FILE *read, *write;

char temp[max];

//打开文件流

read = fopen(r, "r");

write = fopen(w, "w");

// 可以完整的从文件复制内容,fgets会把换行也存储在字符串中

while (fgets(temp, max, read) != NULL) {// 长度不够对于写文件没多大影响

fputs(temp, write);// fputs不会自动加换行

puts(temp);// puts会自动加换行

}

// 关闭文件流

if (fclose(read) == 0) {

printf("\nClose successfully");

}

if (fclose(write) == 0) {

printf("\nClose successfully");

}

return 0;

}

c语言中 gets puts,C语言的文件输入输出 getc putc gets puts fgets puts fscanf fprintf相关推荐

  1. c语言中void指针,C 语言 void指针

    C 语言 void指针 到目前为止,我们已经研究了分配给指针的地址应该与指针声明中指定的类型相同. 例如,如果我们声明了int指针,则此int指针不能指向float变量或某种其他类型的变量,即它只能指 ...

  2. html语言中%3c%%%3e中语言,[工学]C语言程序设计习题解答.doc

    [工学]C语言程序设计习题解答 C程序设计习题 第一章 C 语言基础知识 1.1 选择题 1. C语言源程序的基本单位是_____. A. 过程 B. 函数 C. 子程序 D. 标识符 2. 下列各组 ...

  3. c语言中.和-区别,c语言中-和.的区别

    对于c语言中"->"和"."的区别总结如下: 1.A.B则A为对象或者结构体: 2.A->B则A为指针,->是成员提取,A->B是提取A ...

  4. 字符'0'到'9'在c语言中,/0在c语言中是什么意思?

    01 "\0"在c语言中代表"字符串结束符"."\0"的ASCII码为"0",也就是空字符:字符串总是以"\0 ...

  5. c语言中-1%3=,c语言数据类型.ppt

    c语言数据类型 C语言程序设计 贵州大学电气工程学院 测控技术与仪器教研室 王民慧 本章主要内容: 3.1 C的数据类型 基本类型 构造类型 指针类型 空类型 C语言中的数据类型如下所示: 一.常量与 ...

  6. c语言中inline用法,C语言陷阱与技巧第2节,使用inline函数可以提升程序效率,但是让inline函数生效是有条件的...

    打开 Linux 内核源代码,会发现内核在定义C语言函数时,有很多都带有 "inline"关键字,请看下图,那么这个关键字有什么作用呢? inline 关键字的作用 在C语言程序开 ...

  7. r语言中mpg数据_R语言数据筛选整理包dplyr

    dplyr软件包是R中功能最强大,最受欢迎的软件包之一.该软件包由最受欢迎的R程序员Hadley Wickham编写,他编写了许多有用的R软件包,如ggplot2,tidyr等.本文包括一些示例和如何 ...

  8. c语言中void f1(),c语言常见笔试题f1ryiedy.doc

    c语言常见笔试题f1ryiedy c语言常见笔试题总结 [1 使用宏] 1.1 #ifdef NDEBUG #define TRACE(S) S #else #define TRACE(S) prin ...

  9. c语言中strtod用法,C语言进阶之路:strtod()函数的用法!

    函数原型: #include double strtod(const char *nptr, char **endptr); C语言及C++中的重要函数. 名称含义 strtod(将字符串转换成浮点数 ...

最新文章

  1. thinkphp gd 添加文字
  2. python常见内置函数_python常见的内置函数
  3. 计算机网络自顶向下方法【七】——链路层
  4. MonkeyFest2018 微软最有价值专家讲座
  5. 分享大牛开发经验,浅谈java程序员职业规划
  6. JavaScript基础知识(四)
  7. 牛客网暑期ACM多校训练营(第二场):J. farm(暴力)
  8. MSB与LSB的含义
  9. 一个人做饭有哪些推荐?
  10. sql删除表中各类重复数据
  11. GPS数据包格式+数据解析
  12. 【机器学习】监督学习的分类:判别/生成模型,概率/非概率模型、参数/非参数模型
  13. 使用纯JavaScript实现全网页动态樱花飘落特效
  14. Java8 处理日期和时间
  15. ArcGIS基础:合并表格(追加、合并工具)
  16. Spring 和 JAVA 的牵绊
  17. 滚动 下拉简单实现分页
  18. 塑料袋吹膜机多少钱一台_塑料袋制袋机多少钱一台-卓越机械(在线咨询)-塑料袋制袋机...
  19. python修改电脑桌面壁纸_python实现桌面壁纸切换功能
  20. 对话腾讯马晓轶:游戏投资布局稳健,发起“登月项目”探索未来

热门文章

  1. 人体姿态估计HRNet网络模型搭建代码详解
  2. 欢乐射击html5 星际,周末微信小游戏推荐:射击、对战、吃鸡、体育应有尽有
  3. 超级十全大补贴!!打造您心目中完美的TREO!!『上』
  4. xp php mysql_Win XP下全新安装Apache2,PHP5,MYSQL5
  5. AST2500 NC-SI功能调试
  6. macOS逆向(MindNode)
  7. 17.4 字体枚举
  8. 载波集中抄表的路径搜索算法研究
  9. http协议请求https协议报错或警告处理方案
  10. springBoot项目集成quartz开发定时任务案例及注意事项