c(2)文件操作库函数+可变长参数表

时间:2022-12-17 19:44:40

<stdio.h>

1)fopen,fclose

//01fopen.c

#include <stdio.h>
int main(void){
    FILE *fp=NULL;
    fp=fopen("file.c","w");//打开只写文件,不存在则新建
    if(fp==NULL){
        return -1;
    }
    fclose(fp);
    fp=NULL;
    fp=fopen("file.c","a");//以追加方式打开文件,不存在则新建
    if(fp==NULL){
        return -1;
    }
    fclose(fp);
    fp=NULL;
    fp=fopen("file.c","r");//只读方式打开,文件必须存在,否则失败
    if(fp==NULL){
        return -1;
    }
    fclose(fp);
    fp=NULL;
    return 0;
}

2)

int fprintf(FILE *stream, const char*format, ...);

int fscanf(FILE *stream, const char *format, ...);

//02fio.c 

#include <stdio.h>
int main(void){
    FILE *fp=NULL;
    fp=fopen("file.c","w");
    if(fp==NULL){
        return -1;
    }
    int a=10;
    float f=12.34;
    double d=12345.6789;
    char c='a';
    fprintf(fp,"%d%f%lf%c",a,f,d,c);//用格式化的方法将4个变量写入文件
    fclose(fp);
    fp=NULL;
    fp=fopen("file.c","r");
    if(fp==NULL){
        return -1;
    }
    int a1;
    float f1;
    double d1;
    char c1;
    //用格式化方法从文件file.c中读入4个数据到这4个新的变量中。
    fscanf(fp,"%d%f%lf%c",&a1,&f1,&d1,&c1);//
    printf("%d%f%lf%c",a1,f1,d1,c1);
    fclose(fp);
    fp=NULL;
    return 0;
}
输出:

10120.3400000.678900a

此时file.c里的内容为:

1012.34000012345.678900a


3)
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

[注:size_t为long unsigned int]

//03frw.c

#include <stdio.h>
#include <string.h>
struct student{
    int id;
    char name[20];
    char address[100];
};
int main(void){
    FILE *fp=NULL;
    fp=fopen("file.c","w");
    if(fp==NULL)
        return -1;
    int a=10;
    double d=12345.6789;
    char str[1024]="This is a string.";
    //将变量写入文件
    fwrite(&a,sizeof(int),1,fp);
    fwrite(&d,sizeof(double),1,fp);
    int len=strlen(str)+1;
    fwrite(&len,sizeof(int),1,fp);
    fwrite(str,sizeof(char),len,fp);
    //将结构体写入
    struct student stu={1000,"zhangfei","南京"};
    fwrite(&stu,sizeof(struct student),1,fp);
    fclose(fp);
    fp=NULL;
    fp=fopen("file.c","r");
    if(fp==NULL)
        return -1;
    int a1;
    double d1;
    char str1[1024];
    //从文件中读取数据放在变量中
    fread(&a1,sizeof(int),1,fp);
    fread(&d1,sizeof(double),1,fp);
    int len1;
    fread(&len1,sizeof(int),1,fp);
    fread(str1,sizeof(char),len,fp);
    printf("%d%f%d%s\n",a1,d1,len1,str1);
    //读取结构体
    struct student stu1;
    fread(&stu1,sizeof(struct student),1,fp);
    printf("%d %s %s\n",stu1.id,stu1.name,stu1.address);
    fclose(fp);
    fp=NULL;
    return 0;
}
输出:
1012345.67890018This is a string.

1000 zhangfei 南京

此时file.c里的内容为:

[空行]

 ^@^@^@¡ø1æÖ^\È@^R^@^@^@This is a string.^@è^C^@^@zhangfei^@^@^@^@^@^@^@^@^@^    @^@^@å<8d><97>京^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^    @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^    @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@


fprintf函数读取数字时,文件里是正确格式; 而fread函数读取数字时,文件里是乱码,不知何故。

二者输出的文件内容都是正确格式。

4)

 int fseek(FILE *stream, longoffset,  int
       whence);

long ftell(FILE *stream);

//05fseek.c

#include <stdio.h>
#include <string.h>
int main(){
    FILE *fp=NULL;
    fp=fopen("file.c","w+");
    if(fp==NULL)
        return -1;
    char buf[]="abcdefghijklmnopqrstuvwxyz";
    fwrite(buf,sizeof(char),26,fp);
    //用ftell()获取文件大小
    fseek(fp,0,SEEK_END);
    long len=ftell(fp);
    printf("文件长度为:%ld个字节\n",len);
    fseek(fp,0,SEEK_SET);//指针定位到文件头开始的的一个字节
    memset(buf,0,26);//将buf数组中放入26个字符'\0',即清空
    fread(buf,sizeof(char),10,fp);
    printf("%s\n",buf);
    fseek(fp,5,SEEK_CUR);//文件指针定位到当前位置向后偏移5个字节的位置
    memset(buf,0,26);
    fread(buf,sizeof(char),10,fp);
    printf("%s\n",buf);
    fseek(fp,-10,SEEK_END);//文件指针定位到文件尾向前偏移10个字节的位置
    memset(buf,0,26);
    fread(buf,sizeof(char),10,fp);
    printf("%s\n",buf);
    fclose(fp);
    fp=NULL;
    return 0;
}


5)拷贝文件副本,源文件和副本文件的文件指针分别为:fp,fp1.代码为:
while((ch=getc(fp))!=EOF)

    putc(ch,fp1);  

6)可变长参数的使用

<stdarg.h>
  void va_start(va_list ap, last);

  type va_arg(va_list ap, type);

  void va_end(va_list ap);

  voidva_copy(va_list dest, va_list src)    
#include <stdio.h>
#include <stdarg.h>
int max(int cnt,...)
{
    va_list v;//定义可变长参数表V
    va_start(v,cnt);//用函数va_start将参数cnt之后的那些参数保存到v中
//使用函数va_arg从参数表中取一个int 类型参数放入变量maxvalue
//中,并设maxvalue保存的是所有参数中的最大值
    int maxvalue=va_arg(v,int);
    //循环遍历cnt后面的参数
    for(int i=1;i<cnt;i++){
        int data=va_arg(v,int);
        if(data>maxvalue)
            maxvalue=data;
    }
    va_end(v);//释放可变长参数表v
    return maxvalue;
}
int main(){
   int maxNum=max(10,12,23,1,2,3,4,5,6,7,45);
    printf("最大数为:%d\n",maxNum);
    return 0;
}