xm C语言12

1.rewind函数

因为我们定义的FILE*fp 是一个指针,所以他不断移动的时候最终会到达文件末尾,我们如果还想使用这个文件关闭再打开未免太过麻烦,所以就有了rewind

rewind的作用就是将指针移动到文件开头,在 再次读取相同的文件 以及读写之间转换 时起作用

objectivec 复制代码
   #inclde<stdio.h>
   int main(){
//rewind函数
    FILE*fp=fopen("ok.txt","r");
    if(file==NULL){
    printf("error");
    return 0;}
    char x;
    while(fscanf(fp,"%c",&x)!=EOF){
        printf("%c",x);
    }
    rewind(fp);
    printf("again\n");
    while(fscanf(fp,"%c",&x)!=EOF){
        printf("%c",x);
    }
    fclose(fp);
    return 0;}

2.structure结构体写入和读取文件

写入:将结构体的内容传入到文件中保存,文件可以保存大量的结构体,使用方便

fprintf(file.name,"%s/%d....",variable);

读取:从文件中读取相应的内容传到内存,供计算机短期使用

fscanf(file.name,"%s",&x address);

objectivec 复制代码
    #include<stdio.h>
    struct school{char name[20];
               int a;//age
               char grade;//ABCD
               };
    int main(){
    FILE*file=fopen("school.txt","w");
    if(file==NULL){
    printf("error");
    return 0;}
    struct school s1={amy,18,B};
    fprintf(file,"name is %s, age is %d,grade is %c",s1.name,s1.a,s1.grade);}
    fclose(file);
    file=fopen("school.txt","r");
    char k;
    while(fscanf(file,"%c",&k)!=EOF){
        printf("%c",k);
    }
    fclose(file);
    return 0;}

这里输出用到的while循环就是当我读取的内容不等于EOF(不是结尾的时候)因此最后输出的结构就是 name is amy,age is 18,grade is B

同时在这里的while循环也可以是

fscanf(file,"name is %s,age is %d,grade is %c",&s1.name,&s1.a,&s1.grade);

printf("name is %s, age is %d,grade is %c",s1.name,s1.a,s1.grade);

fscanf的格式必须和fpeintf输入的完全匹配

结构体数组:(其实和结构体无异,只是这一步我想进行自己写入信息存储到文件中)

objectivec 复制代码
#include <stdio.h>
#include <stdlib.h>
struct school{
char name[20];
int a;//age
char grade;//ABCD
};
int main()
{ FILE*file=fopen("school.txt","w");
    struct school s[2];
   for(int o=0;o<2;o++){
    // 出错点struct school s[o]; 
    scanf("%s  %d  %c",&s[o].name,&s[o].a,&s[o].grade);
   }
    for(int i=0;i<2;i++){
    fprintf(file,"name is %s, age is %d,grade is %c",s[i].name,s[i].a,s[i].grade);}
    fclose(file);
    file=fopen("school.txt","r");
    char k;
    while(fscanf(file,"%c",&k)!=EOF){
        printf("%c",k);
    }
    fclose(file);
    return 0;}

3.search 从文件中查找

第一种 使用sctmp函数 strcmp(x,y)是逐字符比较然后进行做差,通常寻找单字符时使用

objectivec 复制代码
#include <stdio.h>
#include <stdlib.h>
int main()
{  FILE*fp=fopen("test.txt","w");
    if(fp==NULL){
        printf("error");
        return 0;
    }
    char ch[20]="letter";
    char word[]="A";
    fputs(ch,fp);
    fclose(fp);
    fp=fopen("test.txt","r");
    char k[20];
    
    int count=0;
    while(fscanf(fp,"%s",k)!=EOF){
                if(strcmp(k,word)==0)
        count++;
    }
     printf("occur %d times",count);
    fclose(fp);
    return 0;
}

第二种就是直接if进行比较(只需要换while循环部分) 如果是整数就更好做了

objectivec 复制代码
 
 while(fscanf(fp,"%c",&k)!=EOF){
 if(strcmp(k,word)==0)
        count++;
    }
 while(fscanf(fp,"%s",k)!=EOF){
 if(strcmp(k,word)==0)
        count++;
    }

4.f()的格式

首先f....()都是函数,只是简化了格式,但是仍然需要输入所需的内容来获得函数结果。他们来自于函数库 stdio.h 所以使用之前记得调用函数库

fscanf(文件指针, 格式字符串, 输入项表列) eg fscanf(fp, "%d,%f", &i, &t)

fprintf(文件指针, 格式字符串, 输出表列) eg ``fprintf(fp, "%d,%f", i, t)

fgets(字符数组, 最大字符数, 文件指针),作用是读取一行内容(包括换行符),并在末尾自动添加空字符 '\0' eg fgets(str, 100, fp) 从文件读取最多 99 个字符

fputs(字符串, 文件指针),作用是将字符串写入文件,不添加额外换行符 eg fputs("Hello", fp)

(四种用法来自夸克)

5.注意NULL EOF检查 记得关闭文件

相关推荐
tabzzz4 小时前
大道至简:万字漫谈前端性能监控
前端·javascript·性能优化
超级大福宝4 小时前
C++中1 << 31 - 1相当于INT_MAX吗?
c语言·c++
0思必得04 小时前
[Web自动化] CSS基础概念和介绍
前端·css·python·自动化·html·web自动化
芯联智造4 小时前
【stm32简单外设篇】- 高灵敏麦克风传感器模块 KY-037
c语言·stm32·单片机·嵌入式硬件
偶遇急雨洗心尘4 小时前
记录一次服务器迁移时,数据库版本不一致导致sql函数报错和系统redirect重定向丢失域名问题
运维·服务器·数据库·sql
小胖霞4 小时前
全栈系列(15)github Actions自动化部署前端vue
前端·node.js·github
未来魔导4 小时前
基于 Gin 框架的 大型 Web 项目推荐架构目录结
前端·架构·gin
羊村懒哥4 小时前
ubuntu24.04系统安装VNC
linux·运维·服务器
foundbug9995 小时前
Modbus协议C语言实现(易于移植版本)
java·c语言·前端