c语言之I/O函数

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。如以下例子所示

 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 0;
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()函数他们要使用的文件。如下所示

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()函数相似,区别在于前者需要第一个参数来指定合适的文件。如下所示

 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(1);
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] != '\0')
17         fprintf(fp,"%s ",words);
18     puts("File contents: ");
19     rewind(fp);
20     while(fscanf(fp, "%s", words)==1)  //它的返回值也是成功读取值的个数
21         puts(words);
22     if(fclose(fp) != 0)
23         fprintf(stderr, "error closing file.\n");
24     return 0;
25 }
  •  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[10];
FILE * fp;
...
fwrite=(data, sizeof(float), 10, fp);

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

fread()函数的原型是:

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

 

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

double data[10];
FILE * fp;
...
fread(data, sizeof(double), 10, 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 = 0; i < ARSIZE; i++)
16         numbers[i] = 100.0 * i + 1.0 / (i + 1);
17     //尝试打开文件
18     if((iofile = fopen(file, "wb")) == NULL)
19     {
20         fprintf(stderr, "Could not open %s for output.\n", file);
21         exit(1);
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(2);
29     }
30     //从文件中读取所选的项目
31     printf("Enter an index in the range 0-%d.\n", file);
32     scanf("%d",&i);
33     while(i >=0 && i < ARSIZE)
34     {
35         pos = (long) i * sizeof(double); //计算偏移量
36         fseek(iofile, pos, SEEK_SET);   //在文件中定位到目标位置
37         fread(&value, sizeof(double), 1, 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 0;
45 }

 

posted @ 2016-05-14 00:26  eliker  阅读(946)  评论(0编辑  收藏  举报