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()函数没有参数,它返回来自输入设备的下一个字符。以下输入输出代码是等效的。这两个函数能读取输入的任意一个字符串,包括空格和换行符。

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

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

 #include<stdio.h>
#define MAX 61
int main()
{
char name[MAX];
char * ptr; printf("Hi, what's your name?\n");
ptr=gets(name);
puts(ptr);//puts(name);
puts(" Ah! that's a good name, i like it!");
return ;
}
  • 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()函数他们要使用的文件。如下所示

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

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

 #include<stdio.h>
#include<stdlib.h>
#define MAX 40
int main()
{
FILE * fp;
char words[MAX]; if((fp=fopen("words","a+"))==NULL)
{
frptinf(stdout, "can't open \"words\" file.\n");
exit();
}
puts("Enter words to add to the file: press to the Enter");
puts("key at the begining of a line to terminate.");
while(gets(words)!=NULL && words[] != '\0')
fprintf(fp,"%s ",words);
puts("File contents: ");
rewind(fp);
while(fscanf(fp, "%s", words)==) //它的返回值也是成功读取值的个数
puts(words);
if(fclose(fp) != )
fprintf(stderr, "error closing file.\n");
return ;
}
  •  fseek()和ftell()

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

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

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

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

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

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

先来看一下fwrite()

fwrite()函数的原型是:

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

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

float data[];
FILE * fp;
...
fwrite=(data, sizeof(float), , fp);

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

fread()函数的原型是:

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

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

double data[];
FILE * fp;
...
fread(data, sizeof(double), , fp);

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

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

 /*随机存储,二进制I/O*/
#include<stdio.h>
#include<stdlib.h>
#define ARSIZE 1000 int main()
{
double numbers[ARSIZE];
double value;
const char * file = "numbers.dat";
int i;
long pos;
FILE * iofile;
//创建一组double类型的值
for(i = ; i < ARSIZE; i++)
numbers[i] = 100.0 * i + 1.0 / (i + );
//尝试打开文件
if((iofile = fopen(file, "wb")) == NULL)
{
fprintf(stderr, "Could not open %s for output.\n", file);
exit();
}
fwrite(numbers, sizeof(double), ARSIZE, iofile);
fclose(iofile);
if((iofile = fopen(file, "rb")) == NULL)
{
fprintf(stderr, "Could not open %s for random access.\n", file);
exit();
}
//从文件中读取所选的项目
printf("Enter an index in the range 0-%d.\n", file);
scanf("%d",&i);
while(i >= && i < ARSIZE)
{
pos = (long) i * sizeof(double); //计算偏移量
fseek(iofile, pos, SEEK_SET); //在文件中定位到目标位置
fread(&value, sizeof(double), , iofile);
printf("The value there is %f.\n", value);
puts("Next index (out of range to quit):\n");
scanf("%d",&i);
}
fclose(iofile);
puts("Bye!");
return ;
}

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. Python 基础之四初识Python数据类型

    数字 Int,整型 Float,浮点型 Long,长整型 布尔 字符串 列表 元组 字典 1.数字 INT(整型) 在32位系统上,整数的位数为32位,取值范围为-2**31~2**31-1,即-21 ...

  2. 关于MySql的1146错误修正

    在Mysql数据库中建立连接Mysql后建立了一个数据库名叫Mysql后删除了系统自动建立的数个表,导入.sql文件运行后,想要运行相关的SQL语句却发现一些未知错误为 Table 'mysql.pr ...

  3. jquery 通过submit()方法 提交表单示例

    jquery 通过submit()方法 提交表单示例: 本示例:以用户注册作为例子.使用jquery中的submit()方法实现表单提交. 注:本示例仅提供了对表单的验证,本例只用选用了三个字段作为测 ...

  4. Laravel大型项目系列教程(二)之用户管理

    Laravel大型项目系列教程(二) 一.前言 本节教程将大概实现用户的注册.修改个人信息.管理用户功能. 二.Let's go 1.创建用户注册视图 $ php artisan generate:v ...

  5. get和post的区别

    http://localhost:8080/shopc/check.do?username=zhangsan&pwd=123456 http://localhost:8080/shopc/ch ...

  6. UML类图关系全面剖析

    UML的类图关系分为: 关联.聚合/组合.依赖.泛化(继承).而其中关联又分为双向关联.单向关联.自身关联:下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里. 1.关联 双向关联:C1- ...

  7. 在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下:

    Asp.net MVC中的ViewData与ViewBag ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP. ...

  8. Node.js 教程 05 - EventEmitter(事件监听/发射器 )

    目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...

  9. python ldap

    # -*- coding: UTF-8 -*- import ldap, ConfigParser, os from ldap import modlist LDAP_HOST = "myd ...

  10. netty学习资料

    netty学习资料推荐官方文档和<netty权威指南>和<netty in action>这两本书.下面收集下网上分享的资料 netty官方参考文档 Netty 4.x Use ...