1、 字符读写文件流
l fgetc(由文件中读取一个字符——字符读写文件流)
相关函数 open,fread,fscanf,getc
表头文件 include <stdio.h>
定义函数 int fgetc(FILE *stream);
函数说明 fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。
返回值 getc()会返回读取到的字符,若返回EOF则表示到了文件尾。
范例
#include <stdio.h>
main()
{
FILE *fp;
int c;
fp = fopen(“exist”,”r”);
while((c=fgetc(fp))!=EOF)
printf(“%c”,c);
fclose(fp);
}
l getc(由文件中读取一个字符)
相关函数 read,fopen,fread,fgetc
表头文件 #include<stdio.h>
定义函数 int getc(FILE * stream);
函数说明 getc()用来从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF(-1)。虽然getc()与fgetc()作用相同,但getc()为宏定义,非真正的函数调用。
返回值 getc()会返回读取到的字符,若返回EOF则表示到了文件尾。
范例 参考fgetc()。
l getchar(由标准输入设备内读进一字符)
相关函数 fopen,fread,fscanf,getc
表头文件 #include <stdio.h>
定义函数 int getchar(void);
函数说明 getchar()用来从标准输入设备中读取一个字符。然后将该字符从unsigned char转换成int后返回。
返回值 getchar()会返回读取到的字符,若返回EOF则表示有错误发生。
附加说明 getchar()非真正函数,而是getc(stdin)宏定义。
范例
#include <stdio.h>
main()
{
FILE * fp;
int c,i;
for(i=0li<5;i++)
{
c=getchar();
putchar(c);
}
}
执行 1234 /*输入*/
1234 /*输出*/
l fputc(将一指定字符写入文件流中)
相关函数 fopen,fwrite,fscanf,putc
表头文件 #include <stdio.h>
定义函数 int fputc(int c, FILE * stream);
函数说明 fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中。
返回值 fputc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。
范例 #include <stdio.h>
main()
{
FILE * fp;
char a[26] = ”abcdefghijklmnopqrstuvwxyz”;
int i;
fp= fopen(“noexist”,”w”);
for(i=0;i<26;i++)
fputc(a[i],fp);
fclose(fp);
}
l putc(将一指定字符写入文件中)
相关函数 fopen,fwrite,fscanf,fputc
表头文件 #include<stdio.h>
定义函数 int putc(int c,FILE * stream);
函数说明 putc()会将参数c转为unsigned char后写入参数stream指定的文件中。虽然putc()与fputc()作用相同,但putc()为宏定义,非真正的函数调用。
返回值 putc()会返回写入成功的字符,即参数c。若返回EOF则代表写入失败。
范例 参考fputc()。
l putchar(将指定的字符写到标准输出设备)
相关函数 fopen,fwrite,fscanf,fputc
表头文件 #include<stdio.h>
定义函数 int putchar (int c);
函数说明 putchar()用来将参数c字符写到标准输出设备。
返回值 putchar()会返回输出成功的字符,即参数c。若返回EOF则代表输出失败。
附加说明 putchar()非真正函数,而是putc(c,stdout)宏定义。
范例 参考getchar()。
2、 行读写文件流
l puts(将字符串写入标准输出流stdout)
相关函数 fopen,fread,fscanf,fgets
表头文件 #include <stdio.h>
定义函数 int *puts(char *s);
函数说明 puts()将s指向的以空字符结尾的字符串(后接换行符,但不写入终止空字符)写入标准输出流stdout。
返回值 puts()若成功则返回非负整数,否则返回EOF。
范例 参考fgets()
#include"stdio.h"
main()
{
static char c[] = "This is just a test\ndhaha…";
puts(c);
}
从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。
l fputs(将一指定的字符串写入文件内)
相关函数 fopen,fwrite,fscanf,fputc,putc
表头文件 #include<stdio.h>
定义函数 int fputs(const char * s, FILE * stream);
函数说明 fputs()用来将参数s所指的字符串写入到参数stream所指的文件内(但不追加换行符,也不写入终止空字符)。
返回值 若成功则返回写出的字符个数,返回EOF则表示有错误发生。
范例 请参考fgets()。
l gets(从标准输入设备读进一字符串)
相关函数 fopen,fread,fscanf,fgets
表头文件 #include <stdio.h>
定义函数 char * gets(char *s);
函数说明 gets()用来从标准设备读入字符并存到参数s所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上NULL作为字符串结束。
返回值 gets()若成功则返回s指针,返回NULL则表示有错误发生。
附加说明 由于gets()无法知道字符串s的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题。建议使用fgets()取代。
范例 参考fgets()
#include "stdio.h"
main()
{
char st[15];
printf("input string:\n");
gets(st);
puts(st);
}
可以亲自调试一下,当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束,这是与scanf函数不同的。
l fgets(由文件中读取一字符串——行读写文件流)
相关函数 open,fread,fscanf,getc
表头文件 include <stdio.h>
定义函数 char * fgets(char * s, int size, FILE * stream);
函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。
返回值 gets()若成功则返回s指针,返回NULL则表示有错误发生。
范例 #include<stdio.h>
main()
{
char s[80];
fputs(fgets(s, 80, stdin), stdout);
}
执行
this is a test /*输入*/
this is a test /*输出*/
3、 块读写文件流
l fread(从文件流读取数据)
相关函数 fopen,fwrite,fseek,fscanf
表头文件 #include <stdio.h>
定义函数 size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);
函数说明 fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。
返回值 返回实际读取到的nmemb数目。
#include <stdio.h>
int main(int argc, char **argv)
{
struct student{
char name[10];
int number;
};
FILE *fp = NULL;
int i;
struct student boya[2], boyb[2], *pp, *qq;
if(NULL == (fp = fopen("aa.txt", "w+"))){
perror("can not open aa.txt!");
return (-1);
}
pp = boya;
qq = boyb;
printf("please input two students' name and number:\n");
for(i = 0; i < 2; i++, pp++){
scanf("%s\t%d", pp->name, &(pp->number));
}
pp = boya;
fwrite(pp, sizeof(struct student), 2, fp);
rewind(fp);
fread(qq, sizeof(struct student), 2, fp);
printf("name\t\t number\n");
for(i = 0; i < 2; i++, qq++){
printf("%s\t\t %d\n", qq->name, qq->number);
}
fclose(fp);
return (0);
}
执行:
Holy 0
Shit 1
结果:
Name number
Holy 0
Shit 1
l fwrite(将数据写至文件流)
相关函数 fopen,fread,fseek,fscanf
表头文件 #include<stdio.h>
定义函数 size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream);
函数说明 fwrite()用来将数据写入stream所指定的文件流中。参数stream为已打开的文件指针,参数ptr 指向欲被写入的数据地址,总共写入的字符数以参数size*nmemb来决定。fwrite()会返回实际写入的nmemb数目。
返回值 返回实际写入的nmemb数目。
范例 参考fread()。