C第五天任务
输入文件名,创建文件,并写入文件内容。
如下:
答案:
1:
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE*fp;
char ch,filename[20];
printf("请输入文件名:\n");
scanf("%s",filename);
fp=fopen(filename,"w");
ch=getchar();
printf("请输入数据内容:\n");
ch=getchar();
while(ch!='\n')
{
fputc(ch,fp);
ch=getchar();
}
fclose(fp);
printf("Read Data:");
fp=fopen(filename,"r");
while(!feof(fp))
{
ch=fgetc(fp);
putchar(ch);
}
fclose(fp);
putchar(10);
}
2:
#include <stdio.h>
int main()
{
FILE *fp=NULL;
int temp;
char fName[30];
char Dbuf[100];
memset(fName,0,30);
printf("请输入文件名:\n");
scanf("%s",fName);
fp = fopen(fName,"w+");
if(fp== NULL)
{
printf("文件创建失败\n");
}
memset(Dbuf,0,100);
printf("请输入数据内容:\n");
scanf("%s",Dbuf);
temp=fwrite(Dbuf,1,strlen(Dbuf),fp);
fclose(fp);
fp = fopen(fName,"rb");
memset(Dbuf,0,100);
fread(Dbuf,1,temp,fp);
printf("Read Data: %s",Dbuf);
fclose(fp);
return 0;
}
现在讲解有关的几个函数:
1.fopen函数 — 打开一个文件流
函数原型:FILE* fopen(const char *path, const char *mode);
参数:参数path是需要打开文件的文件名,通常把它叫做文件的路径,
参数 mode 是打开文件的权限(只读、只写、读写等)。
返回值:打开成功返回指向打开文件的指针,后序可以通过这个指针来访问该文件。打开失败则返回NULL。
关于第三个参数----文件打开的方式有如下几个选项
r | 只读的方式打开 |
---|---|
r+ | 以读写的方式打开,读写都从文件开头开始(并不会清空文件里边原有的内容) |
w | 只写的方式打开,先清空,再重头写 |
w+ | 以读写的文件打开,如果该文件不存在就创建,如果存在,读写从文件开头开始,写之前要先清空文件里边原有的内容。 |
a | 如果文件不存在就创建,用于追加写入 |
a+ | 用于追加读/写 |
2.fgetc/fputc函数 —读取/写入一个字节
函数原型:int fgetc(FILE *stream);
参数:打开的文件流,即fopen函数的返回值。
返回值:返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF。
3.fgets/fputs函数 —读取/写入一个字符串
函数原型:char *fgets(char *str, int size, FILE *stream);
参数:
参数str,存储着需要写入的字符串/用于存储读出来的数据
参数size是读取或者写入的字符创的长度。
参数stream是打开的文件流,fopen函数的返回值。
返回值:调用成功,将读取的字符串返回,使用fgets函数读取的时候会自动在字符串后边加上一个‘\0’,失败返回NULL。
4.fread函数 —从文件流中读取一段数据
函数原型size_t fread(void *ptr, size_t size, size_t nmemb, FILE stream);
参数:参数ptr用于存放读取的内容。由于读取的内容的类型不固定(可叫做读取记录吧)有可能是一个字符,整型或者结构体,所以是void 类型的。
参数size 是读取记录的大小。
参数nmemb是读取记录的条数。
stream是文件流,fopen函数的返回值。
返回值:返回的是成功读取到的字节数。有时候我们期望读到很多数据,然后文件流里边又没有那么多数据,该函数会将我们已经读取到的数据的字节数返回。所以,返回值有时候并不等于我们期望读的数据的长度。
5.fwrite函数 —向文件里边写数据
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数:参数ptr是想要写入到文件流里边去的内容。
参数size是将要写入元素的大小。
参数nmemb是将要写入元素的个数。
参数stream是将要写入的地方。
返回值:返回成功写入数据的字节数。
6.fprintf函数 —将格式化的数据写入文件
函数原型:int fprintf(FILE *stream, const char *format, …);
参数:参数stream是文件指针
参数format格式化字符串
后边跟输出列表
返回值:本次写入操作写到文件中的字节数。
使用:fprintf(fp, “%d”,buffer);
fprintf与printf的不同之处在于printf是写入到标准输出(屏幕),而fprintf是将数据写入到指定的文件中去。
7.fscanf函数 —格式化的数据读出到变量
函数原型:int fscanf(FILE *stream, const char *format, …);
参数:参数stream是文件指针
参数format格式化字符串
后边跟将要被赋值的变量
返回值:本次成功获取数据的字节数。
fscanf与scanf函数的区别在于scanf是从标准输入(键盘)读取数据,而fscanf是从指定的文件中读取数据。
8.fseek函数 —控制文件指针偏移
函数原型:int fseek(FILE *stream, long offset, int whence);
参数:参数stream是文件指针。
offset是偏移量。
whence是指偏移方式。有如下三种值可选:
SEEK_SET 从距文件开头offset 位移量为新的读写位置.
SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量.
说明:当whence 值为SEEK_CUR 或SEEK_END 时, 参数offset 允许负值的出现.
给出两种比较特别的使用方式
1)、将文件指针移动到开头:fseek(fd, 0, SEEK_SET);
2)、将文件指针移动到结尾:fseek(fd, 0, SEEK_END);
返回值:调用成功返回0,失败返回-1,errno会存放错误代码。
9.ftell函数 —获取当前文件指针的位置
函数原型:long ftell(FILE *stream);
返回值:文件指针相对于文件开头的偏移量。
10.rewind函数 —将文件指针指向文件的开头
函数原型:void rewind(FILE *stream);
11.feof函数 —判断文件指针是否指向文件结尾
函数原型:int feof(FILE *stream);
返回值:如果已经到达文件的结尾(已经将文件的最后一个字符都读走了),返回0,否则返回非0数字。
EOF(end of file的简写)是文本文件结束的标志。在文本文件中,数据已字符的ASCⅡ码值的形式存放,普通字符的ASCⅡ码的范围是32到127(十进制),EOF的16进制代码为0XFF(十进制为-1),因此可以用EOF作为文件的结束标识。当把数据以二进制的形式存放到文件中时,就有可能会将数字-1存放到文件中,此时继续根据EOF来判断文件是否结束就会出问题,为了解决这个问题,ASCI C 就提供了feof 函数。
12.使用函数fclose(FILE* stream)关闭打开的文件
打开一个文件后没有使用flose关闭 会导致文件句柄泄漏或者可以统称为资源泄漏。
————————————————
本篇文章部分转载下方链接处的文章,在此对原创文章博主做出感谢!
原文链接:https://blog.csdn.net/guaiguaihenguai/article/details/79933747