#include<stdio.h>
#include<string.h>
#include<stdlib.h>
// 文件有二进制文件和文本文件,里面的数据和类型
// 单个字符慢慢输出
void test_fgetc_fputc(){
char file_name[20]="./data—file.txt";
FILE * fp=fopen (file_name, "w") ; //打开文件
int c; //c:接收fgetc的返回值,定义为int,而非char M
if(NULL==fp)
{
printf ("Failed tO open the file !\n");
exit(0);
}
printf ("请输入字符,按回车键结束:");
while ((c=fgetc (stdin)) != '\n') //stdin:指向标准输人设备键盘文件
{
fputc (c, stdout); //stdout:指向标准输出设备显示器文件
fputc(c,fp);
}
fputc ('\n', stdout);
fclose (fp); //关闭文件
}
void test_fgets_fputs(char file_name[] ,int N){
char str[30];
FILE *fp;
int i;
fp=fopen (file_name, "w+") ; //"w+"模式:先写入后读出
if(NULL==fp)
{
printf ("Failed to open the file !\n");
exit (0);
}
printf ("请输入%d个字符串:\n",N);
for(i=0;i<N;i++)
{
printf ("字符串%d:",i+1);
fgets (str,30, stdin) ;//从键盘输入字符串,存入str数组中
fputs (str, fp) ;//把str中字符串输出到fp所指文件中
}
rewind (fp); //把fp所指文件的读写位置调整为文件开始处
while (fgets(str,30,fp) !=NULL)
{
fputs (str, stdout) ; //把字符串输出到屏幕
}
fclose(fp);
}
void test_fscanf_fprintf(char name_file[]){
int a,b;
char s[30];
FILE *fp=fopen(name_file,"r");
if(NULL==fp)
{
printf ("Failed to open the file!\n");
exit (0);
}
fscanf (fp,"%d%d%s",&a,&b,s) ; //从fp所指文件中读取一个整数保存到变量a中
fclose(fp);
printf("%d,%d %s",a,b,s);
fp=fopen(name_file,"a"); // 追加模式
char name[ 10] ="张三";
char no[15]="20170304007";
int age=17;
if(NULL==fp)
{
printf ("Failed to open the file !\n");
exit (0);
}
fprintf(fp,"%s\t%s\t%d\n",name,no,age); // 将一些字符写入文件
fclose(fp);
}
// 二进制文件的读取和写入 #include<stdio.h>
/*
unsigned fread (void *buf, unsigned size, unsigned count, FILE* fp);
-- buf:指向存放数据块的内存空间,该内存可以是数组空间,也可以是动态分配的内存。void类型指针,故可存放各种类型的数据,包括基本类型及自定义类型等。
-- size:每个数据块所占的字节数。
-- count:预读取的数据块最大个数。
-- fp:文件指针,指向所读取的文件。
unsigned fwrite (const void *bufAunsigned size,unsigned count,FILE* fp);
-- buf:前加const的含义是buf所指的内存空间的数据块只读属性,避免程序中有意或无意的修改。
-- size:每个数据块所占的字节数。
-- count:预写入的数据块最大个数。
-- fp:文件指针,指向所读取的文件。
int fseek(FI:LE *fp, long offset, int origin);
1) origin:文件读写指针移动的基准点(参考点)。基准位置 origin 有三种常量取值:SEEK_SET、SEEK_CUR 和 SEEK_END,取值依次为 0,1,2。
SEEK_SET:文件开头,即第一个有效数据的起始位置。
SEEK_CUR:当前位置。
SEEK_END:文件结尾,即最后一个有效数据之后的位置。注意:此处并不能读取到最后一个有效数据,必须前移一个数据块所占的字节数,使该文件流的读写指针到达最后一个有效数据块的起始位置处。
2) offset:位置偏移量,为 long 型,当 offset 为正整数时,表示从基准 origin 向后移动 offset 个字节的偏移;若 offset 为负数,表示从基准 origin 向前移动 |offset| 个字节的偏移。
返回值:成功,返回 0;失败,返回 -1。
*/
typedef struct {
char name[10];
int age;
char duty[20];
}Animal;
void test_fread_fwrite_fseek(){
int N=3;
Animal a[3] = {{"Judi",5, "police"}, {"Nike", 8, "aidpolice"},{"flash",10, "worker"}},t;
int i;
FILE *fp=fopen ("Animal_Info.bat", "wb+");
if(NULL==fp)
{
printf("Failed to open the file!\n");
exit (0);
}
fwrite(a,sizeof(Animal),N,fp);
fprintf (stdout, "%s\t%s\t%s\n", "name","age","work");
for(i=1;i<=N;i++)
{
fseek(fp,(i-1)*sizeof(Animal),SEEK_SET);
fread(&t,sizeof(Animal),1,fp);
fprintf (stdout, "%s\t%d\t%-s\n", t.name,t.age,t.duty);
}
fclose(fp);
}
void test_feof(char name_file[]){
FILE *fp;
char ch;
fp=fopen(name_file,"r");
ch=fgetc(fp);//先读取一个字符
while(!feof(fp))// 判断指针是不是末尾 当前位置指针指向文件末尾时返回0,返回非零值
{
putchar(ch);
ch=fgetc(fp);
}
}