c语言中常用的I/O函数

最常用的字符串的标准I/O函数有getchar()、putchar()、gets()、puts()、scanf()、printf()、fputs()、fgets()、getc()、putc()、fscanf()、fprintf()、fseek()、ftell()、fread()、fwrite()等。

  • getchar()和putchar()

他们是专门为字符I/O设计的一对C函数,getchar()函数没有参数,它返回来自输入设备的下一个字符。以下输入输出代码是等效的。这两个函数能读取输入的任意一个字符串,包括空格和换行符。

  1. ch=getchar();
  2. scanf("%c", &ch);
    putchar(ch);
    printf("%c", ch);
  • gets()、puts()

gets()能从系统的标准输入设备获得一个字符串,在输入的时候遇到一个换行符(\n)终止,并不读取此换行符,并且在后面自动加上字符串结束标志\0。如以下例子所示

  1. #include<stdio.h>
  2. #define MAX 61
  3. int main()
  4. {
  5. char name[MAX];
  6. char * ptr;
  7.  
  8. printf("Hi, what's your name?\n");
  9. ptr=gets(name);
  10. puts(ptr);//puts(name);
  11. puts(" Ah! that's a good name, i like it!");
  12. return ;
  13. }
  • scanf()和printf()

这两个函数大家都比较熟悉,我就只讲一下这两个函数的返回值。其中scanf()函数的返回成功读取的个数,常用来检测读取是否正确。printf()返回的则是输出的字节数(包含结尾的换行符)。还有一点需要注意的就是printf用在对于字符串%s的输出时,接收的是字符数组的名字也就是字符串的首地址。

  • fgets()和fput()

char * fgets(char * , int , FILE *);总共要输入三个参数,第一个参数是指向输入的字符串的地址,第二个参数是字符串的最大的长度(这个参数可以控制原来的数组空间是否溢出),第三个就是一个文件指针,可以由文件输入,也可以由标准输入设备输入(stdin)。它能读取标准输入中,由于确认输入而输入额外的换行符,同时在字符串的后面添加一个\0。函数能返回输入字符串的首字母的地址。

void fputs(char * ,FILE *);

  • getc(),putc()

这两个函数的工作方式与函数getchar()和putchar()非常相似,不同之处在于你需要告诉getc()和putc()函数他们要使用的文件。如下所示

  1. FILE *fp, *fpout;
  2. fp=fopen("input.txt","r");
    fpout=fopen("output.txt","w");
  3. ch=getc(fp); //一次只能读取一个字符
    putc(ch,fpout); //一次只能输出一个字符
  •  fscanf()和fprintf()

fscanf()和fprintf()的工作方式与scanf和printf()函数相似,区别在于前者需要第一个参数来指定合适的文件。如下所示

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MAX 40
  4. int main()
  5. {
  6. FILE * fp;
  7. char words[MAX];
  8.  
  9. if((fp=fopen("words","a+"))==NULL)
  10. {
  11. frptinf(stdout, "can't open \"words\" file.\n");
  12. exit();
  13. }
  14. puts("Enter words to add to the file: press to the Enter");
  15. puts("key at the begining of a line to terminate.");
  16. while(gets(words)!=NULL && words[] != '\0')
  17. fprintf(fp,"%s ",words);
  18. puts("File contents: ");
  19. rewind(fp);
  20. while(fscanf(fp, "%s", words)==) //它的返回值也是成功读取值的个数
  21. puts(words);
  22. if(fclose(fp) != )
  23. fprintf(stderr, "error closing file.\n");
  24. return ;
  25. }
  •  fseek()和ftell()

这两个函数被称为文件的随机存储函数,其实也不能算作是I/O函数,它能够把文件中的字符串当成数组来处理,直接访问其中的某一位。下面是一些例子,其中fp是一个文件指针

  1. fseek(fp, 0L, SEEK_SET); //找到文件的开始处
  2. fseek(fp, 10L, SEEK_SET); //找到文件的第十个字节
  3. fseek(fp, 2L, SEEK_CUR); //从文件当前位置向前移动2个字节
  4. fseek(fp, 0L, SEEK_END); //到达文件的结尾处
  5. fseek(fp, -10L, SEEK_END); //从文件的结尾处退回10个字节

fseek如果操作成功的话,返回0;如果试图移动超过文件范围,则返回-1。

ftell()函数为long类型,它返回文件的当前位置。文件的第一个字节到文件开始处的距离是字节0,依次类推。用法如下

  1. long site;
  2. ...
  3. site=ftell(fp); //返回文件指针所指的当前位置
  • fread()和fwrite()

这两个函数被称为二进制I/O函数。一般用fprintf()函数向文件中存储浮点数的时候,由于%f的输出,一般情况下不能得到精确值。而使用fread()和fwrite()这两个函数就可以避免这个问题。

先来看一下fwrite()

fwrite()函数的原型是:

  1. xize_t fwirte(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);

例如,要保存一个浮点数组的数据对象,可以这样做

  1. float data[];
  2. FILE * fp;
  3. ...
  4. fwrite=(data, sizeof(float), , fp);

fwirte的返回值是成功写入size大小的数据块的数目,该数目应该与nmemb相等,如果小于的时候就表明由写入的错误。

fread()函数的原型是:

  1. size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);

例如,要从文件中读取10个double值的数组,并保存一个数组中,如下可以实现

  1. double data[];
  2. FILE * fp;
  3. ...
  4. fread(data, sizeof(double), , fp);

函数的返回成功读入的项目数,正常情况下与nmemb相等。

下面的一个例子组合使用了上述提到的几种I/O函数

  1. /*随机存储,二进制I/O*/
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #define ARSIZE 1000
  5.  
  6. int main()
  7. {
  8. double numbers[ARSIZE];
  9. double value;
  10. const char * file = "numbers.dat";
  11. int i;
  12. long pos;
  13. FILE * iofile;
  14. //创建一组double类型的值
  15. for(i = ; i < ARSIZE; i++)
  16. numbers[i] = 100.0 * i + 1.0 / (i + );
  17. //尝试打开文件
  18. if((iofile = fopen(file, "wb")) == NULL)
  19. {
  20. fprintf(stderr, "Could not open %s for output.\n", file);
  21. exit();
  22. }
  23. fwrite(numbers, sizeof(double), ARSIZE, iofile);
  24. fclose(iofile);
  25. if((iofile = fopen(file, "rb")) == NULL)
  26. {
  27. fprintf(stderr, "Could not open %s for random access.\n", file);
  28. exit();
  29. }
  30. //从文件中读取所选的项目
  31. printf("Enter an index in the range 0-%d.\n", file);
  32. scanf("%d",&i);
  33. while(i >= && i < ARSIZE)
  34. {
  35. pos = (long) i * sizeof(double); //计算偏移量
  36. fseek(iofile, pos, SEEK_SET); //在文件中定位到目标位置
  37. fread(&value, sizeof(double), , iofile);
  38. printf("The value there is %f.\n", value);
  39. puts("Next index (out of range to quit):\n");
  40. scanf("%d",&i);
  41. }
  42. fclose(iofile);
  43. puts("Bye!");
  44. return ;
  45. }

c语言之I/O函数的更多相关文章

  1. C语言之字符串处理函数

    C语言中字符串处理函数介绍 下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数).所有的C语言编译系统中一般都提供这些函数. 1.puts函数——输出字符串的函数 一般的形式为p ...

  2. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  3. 如何在C语言中调用Swift函数

    在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中 ...

  4. C语言中的自定义函数

    C语言中可以使用系统函数也可以使用自己的函数,就是自定义函数 自定义函数分为四种 第一种:无参无返回值的 函数的声明 void sayH(); 函数的实现 void sayH(){ printf(&q ...

  5. C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏

    C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...

  6. C语言中返回字符串函数的四种实现方法

    转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...

  7. C语言中关于scanf函数的用法

    scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化 ...

  8. C语言的抽象与函数指针--思想(转)

    一.何为抽象? 从小到大,我们接触到的抽象,最熟悉的莫过于数学了.为什么这样说呢? 比如说,在小学的时候,老师总是拿了几个苹果来引诱我们:同学们,这里有几个苹果啊?于是我们流着口水一个个地数,一个苹果 ...

  9. 第二十三节:Java语言基础-详细讲解函数与数组

    函数 函数在Java中称为方法,在其他语言中可能称为函数,函数,方法就是定义在类中具有特定功能的程序.函数,在Java中可称为方法. 函数的格式: 修饰符 返回值类型 函数名(参数类型 参数1, 参数 ...

  10. C语言第七讲,函数入门.

    C语言第七讲,函数入门. 一丶了解面向过程和面向对象的区别. 为什么要先讲面向过程和面向对象的区别? 面向过程,就是什么都要自己做.  比如你要吃饭. 那么你得自己做饭. 面向对象, 面向对象就是我要 ...

随机推荐

  1. 如果把带有html的标记的字符串从服务端传到页面上,需要对其进行编码。Ajax.JavaScriptStringEncode()

    controller: StringBuilder s = new StringBuilder(); string a = "<script>alert('我StringBuil ...

  2. JQuery使用deferreds串行多个ajax请求

    使用JQuery对多个ajax请求串行执行. HTML代码: <a href="#">Click me!</a> <div></div&g ...

  3. MapFile生成WMS

    MAP  NAME "HBWMS"  STATUS ON  SIZE 800 600  EXTENT 107.795 28.559 116.977 33.627  UNITS ME ...

  4. DLL组件注册器

    在实际程序运行中,尤其是绿色软件,都需要对DLL进行注册才能够使用.下面就是笔者开发的一款简单的DLL注册器. http://pan.baidu.com/s/1mhbrN1e

  5. ddd 聚合根 之 聚合与不聚合 设计

    聚合 不聚合 订单和订单明细 论坛主贴与贴子回复 订单和收货地址(vo)  

  6. JQuery 了解

    jQuery是什么?为什么是这样?怎么用? jQuery是对JavaScript的一种封装,是一个常用功能库.javascript是做什么的jquery就是做啥的.用它主要使写js更简便而强大,有些功 ...

  7. shell比较两个字符串是否相等

    比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then这里的关键有几点:1 使用单个等号2 注意到等号两边各有一个空格 ...

  8. Linux程序包管理之yum及源代码安装

    第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...

  9. 最新win7系统64位和32位系统Ghost装机稳定版下载

    系统来自转载:系统妈 一.主要更新:========================== * 更新了系统补丁和Office2007 SP2所有补丁 通过微软漏洞扫描* 更新QQ至7.1  官方正式版* ...

  10. AC日记——最小的N个和 codevs 1245

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...