[黑马IOS自学第八篇]C语言文件操作,通讯录实现,代码

本文主要介绍了C语言在iOS开发中进行文件操作的方法,包括Static和extern修饰词的使用,文件指针操作,字符串读写函数如fgets和puts的细节,以及数据块和格式化读写的函数应用。通过这些内容,可以理解如何在C语言中实现通讯录的数据存储和读取。
摘要由CSDN通过智能技术生成

一.Static和extern修饰词


<span style="font-size:18px;">#include<stdio.h>
void sum(){
    
    static intcount = 0 ;
    printf("%d\n",count);
    count++;
}
int main(intargc,const char* argv[]) {
    sum();
    sum();
    sum();
    return 0;
}</span>



 2).Extern不能用于修饰局部变量

 


 3).Static修饰的函数因为使用的是static函数,修饰的函数是一个内部函数,只能在定义的文件中使用


main.c

#include<stdio.h>
#include"test.h"
externintMax(int,int);//不在test.h声明的时候
int main(int argc,const char * argv[]) {
   
   //int total = sum(223, 21);
   int av = avg(10,22);
   printf("total = %d\n",av);
   int big =Max(98, 44);
   printf("big is %d\n",big);
   return 0;
}
test.c

#include"test.h"
staticint sum(int a ,int b){//warning:unsed function 'sum'
    
   return  a+ b ;
}
int avg(int a,int b)
{
   returnsum(a,b)/2.0f;//通过内部方法访问static、函数
}
 
externintMax(int a ,int b)//可以省略extern也可以在其他文件中使用
{
   return a>b?a:b;
}
test.h

#ifndeftest_h
#definetest_h
 
#include<stdio.h>
staticint sum(int a,int b);
//externint Max(int a , int b);
int avg(int a,int b);
#endif/* test_h */





 


 

 


 



2.File文件指针

 FILE *fp =NULL;//指向FILE结构指针变量
    //文件的打开
    fp = fopen("a.txt","r");
    //打开成功,返回文件首地址
    //打开失败返回NULL
    //默认读取文件的路径
    ///Users/chingwei_macpc/Library/Developer/Xcode/DerivedData/文件概念-heotuhsmlfpzobgrkgssdhyscwzf/Build/Products/Debug/
    

    if (fp != NULL){
       
        printf("打开成功,按任意键退出\n");
       
    }
    else{
        printf("打开失败,按任意键退出\n");
       getchar();
       exit(1);//非正常退出
    }
    
    //操作文件
    
    //文件关闭函数
    //没有关闭函数,可能导致写不进内容至
    fclose(fp);
    return 0;

2).读写单个字符

 

int main(intargc,const char* argv[]) {
    FILE *fp = NULL;
    
    fp = fopen("a2.txt","w");//w是如果文件名存在,则覆盖然后再写入内容
    char ch = 'X',ch2;
    
    if (fp != NULL){
        //调用写入字符函数
       fputc(ch,fp);
       printf("写入字符成功\n");
       fclose(fp);
    }
    fp = fopen("a2.txt","r");
    if (fp != NULL){
        //调用写入字符函数
       ch2 = fgetc(fp);
       printf("读取字符%c\n",ch2);
    }
    
    fclose(fp);
    return 0;
}
 


3).读取和写入一个字符串

EOF是文件末尾结束标志

文件内部指针每次往后移动位置

int main(intargc,const char* argv[]) {
    FILE *fp  =NULL;
    fp=fopen("te1.txt","w+");//写入并读取,文件不存在再创建
    char ch ;
 
    if (fp != NULL){
       int count = 0 ;
        printf("请输入要保存的字符串:");
       ch = getchar();
       
       while (ch != '\n') {
           count++ ;
           fputc(ch, fp);
           ch = getchar();
           
       }
       printf("本次一共写入%d个字符\n",count);
       
       rewind(fp);//重新指向到文件的首地址
       
       count = 0 ;
       ch=fgetc(fp);
       while (ch != EOF){
           count++;
           putchar(ch);
           ch = fgetc(fp);
       }
       printf("本次一共读取%d个字符\n",count);
    }
    
    fclose(fp);
    
    return 0;
}

4).字符串读写函数fputs


 

 fgets()安全输入法自动截断超出范围的字符串将最后一个改为'\0'防止越界的问题

gets(str,len,stdin);

puts(str,stdout);


int main(intargc,const char* argv[]) {
    
    
    FILE *fp = NULL;
    fp= fopen("yus.txt","a");//在原有的文件进行追加,不存在空格
    char str[]="YUI is BESTCLUBS!\n";
    int count  = 0 ;
    if(fp != NULL)
    {
       count  =fputs(str, fp);//返回值为本次写入的字符长度
       printf("本次共写入%d个字符\n",count);
    }
    fclose(fp);
    return 0;
}


会存在空格因为I str中有存入一个换行字符

当文件使用方式为'a'时候,如果没有文件,则先创建,再写入

#include<stdio.h>
void fputsWrite(){
    
    FILE *fp = NULL;
    fp= fopen("yus1.txt","w");//在原有的文件进行追加,不存在空格
    char str[]="YUI is BESTCLUBS!\n";
    int count  = 0 ;
    if(fp != NULL)
    {
       count  =fputs(str, fp);//返回值为本次写入的字符长度
       printf("本次共写入%d个字符\n",count);
    }
    
    fclose(fp);
}
void fgetsRead(){
    
    FILE *fp = NULL;
    fp= fopen("yus1.txt","r");
    char str2[100];
    
    if(fp != NULL)
    {
        //从文本读取字符串到字符数组中
        //    数组名  长度       fp
        //fgets(str2,10, fp);//str2 ----> YUI is BE
       fgets(str2, sizeof(str2),fp);
        //sizeof(str2)100
        //fgets 当文件内容读取完毕时,会给字符加上\0
        //当遇到\n或者 EOF读取结束
        printf("str2 ---->%s\n",str2);
       
    }
    
    fclose(fp);
}
int main(intargc,const char* argv[]) {
    
    //fputsWrite();
    fgetsRead();
    
    return 0;
}


 

字符串的写入分别保存的,每个字符的ascii码值保存到文件中

#include<stdio.h>
void fputsW(){
    
    FILE *fp = NULL;
    fp = fopen("te1.txt","w");
    
    if(fp != NULL)
    {
       char *s="刘亦菲";//一个汉字占用三个字节
       fputs(s,  fp);
       printf("写入成功\n");
       
       
    }
    
    
    fclose(fp);
}
int main(intargc,const char* argv[]) {
    
    
    FILE *fp = NULL;
    fp = fopen("te1.txt","r");
    char str2[100];
    if(fp != NULL)
    {
       
        fgets(str2,4, fp);//读出刘仅仅一个汉字(一个汉字占3字节)
       fputs(str2, stdout);
       
    }
    
    
    fclose(fp);
    return 0;
}


 



4).数据块的读写函数

//
// Created by CHINGWEI_MACPC on 15/11/12.
//  Copyright © 2015年 itcast. All rights reserved.
//
 
#include<stdio.h>
#include<string.h>
void fwriteW(){
    
    FILE *fp = fopen("te1.txt","w");
    if (fp != NULL){
       
       char *str ="HelloIOS!";
        //     地址 块大小       块数 文件指针
       fwrite(str, strlen(str),1, fp);
       printf("写入成功%ld!\n",strlen(str));
       
    }
    
    fclose(fp);
}
void fwriteWDB(){
    
   FILE *fp =fopen("D1.data","wb");//二进制
    if (fp != NULL){
       
       int a  =123 ;
        //     地址 块大小       块数 文件指针
       fwrite(&a, sizeof(int), 1,fp);
       printf("写入成功!\n");
       
    }
    
    fclose(fp);
}
void freadR(){
    
    FILE *fp = fopen("te1.txt","r");
    if (fp != NULL){
       
       char  str[10] ;//因为存进去的字符数为9
        //     地址 块大小       块数 文件指针
       fread(str, sizeof(str),1, fp);
       printf("读取成功:%s\n",str);
       
    }
    
    fclose(fp);
}
int main(intargc,const char* argv[]) {
    //fwriteWDB();
    fwriteW();
    freadR();
    return 0;
}
 


// main.c
// 从文件中读写结构体信息
//
// Created by CHINGWEI_MACPC on 15/11/12.
//  Copyright © 2015年 itcast. All rights reserved.
//
 
#include<stdio.h>
struct Student{
    
    char name[13];//4*4
    int age ;//4*1
    float score ;//4*1   //一共24*3 =72生成的文件就占72字节
};
int main(intargc,const char* argv[]) {
    struct Studentstu[3]={{"mike",16,95.f},
       {"qinqiong",20,87.5},{"uiy",23,98.f}};
    
    FILE *fp = NULL;
    fp=fopen("student.data","wb+");
    
    if (fp != NULL){
       //写数据到文件
       int i = 0 ;
       while (i<3) {
           
           fwrite(&stu[i], sizeof(structStudent), 1, fp);
          //每次都写入一个元素
           i++;
       }
       printf("写入成功!\n");
       rewind(fp);
       
       struct Studentstud2[3];
       i = 0 ;
       while (i<3) {
           
           fread(&stud2[i], sizeof(structStudent), 1, fp);
           printf("学生姓名:%s,年龄:%d,成绩:%.2f\n",stud2[i].name
                  ,stud2[i].age,stud2[i].score);
           i++;
           
       }
       
    }
    return 0;
}

5).格式化读写函数 fscanf,fprintf


 

// 格式化读写函数fscanf,fprintf
//
// Created by CHINGWEI_MACPC on 15/11/13.
//  Copyright © 2015年 itcast. All rights reserved.
//
 
#include<stdio.h>
 
int main(intargc,const char* argv[]) {
    
    
    FILE *fp = NULL;
    fp =fopen("fprintf.txt","w");
    if (fp != NULL){
       int a = 3 ,b = 4 ,a1 = 0,b1=0;
       fprintf(fp, "%d#%d;",a,b);
       printf("写入成功!\n");
       
       fclose(fp);
       
       fp =fopen("fprintf.txt","r");
       
       fscanf(fp, "%d#%d;",&a1,&b1);
       printf("a1=%d#b1=%d\n",a1,b1);
    }
    fclose(fp);
    return 0;
}

// 读写一个二维数组
//
// Created by CHINGWEI_MACPC on 15/11/13.
//  Copyright © 2015年 itcast. All rights reserved.
//
 
#include<stdio.h>
int main(intargc,const char* argv[]) {
    FILE *fp = fopen("Arr.txt","w+");
    int a[3][2]={1,2,3,4,5,6};
    
    if (fp != NULL){
       
       for (inti = 0 ; i<3; i++) {
                fprintf(fp,"%d,%d\n",a[i][0],a[i][1]);
       }
       printf("写入成功!\n");
      
       rewind(fp);
       
       int arr2[3][2];
       for (inti = 0; i<3; i++) {
           fscanf(fp, "%d,%d#",&arr2[i][0],&arr2[i][1]);
       }
       
       for(inti = 0 ;i < 3 ;i++){
           for (int j =0 ; j<2 ; j++) {
               printf("%d\t",arr2[i][j]);
           }
           printf("-------\n");
       }
    }
    fclose(fp);
    return 0;
}


 

 


#include<stdio.h>
struct Student{
    
    char name[13];
    int age ;
    float score ;
};
int main(intargc,const char* argv[]) {
    
    
    FILE *fp = NULL;
    fp= fopen("student.data", "r");
    
    if (fp != NULL){
       struct Studentstu ;
       
        //文件定位距离文件首24字节的地方
       fseek(fp, sizeof(structStudent),SEEK_SET);
       
       fread(&stu, sizeof(structStudent), 1, fp);
       
        printf("学生姓名:%s,年龄:%d,成绩:%.2f\n",stu.name
              ,stu.age,stu.score);
    }
    
    fclose(fp);
    
    return 0;
}<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);"> </span>


// main.c
//  Feof文件检测函数
//
// Created by CHINGWEI_MACPC on 15/11/13.
//  Copyright © 2015年 itcast. All rights reserved.
//
 
#include<stdio.h>
int main(intargc,const char* argv[]) {
    
    
    FILE *fp = NULL;
    fp = fopen("a2.txt","r");
    if (fp != NULL){
       char tmp = fgetc(fp);
       while(!feof(fp)){
           putchar(tmp);
           tmp =fgetc(fp);
           
       }
       printf("\n");
    }
    fclose(fp);
    
    return 0;
}


没有出现 \377现象

 
#include<stdio.h>
int main(intargc,const char* argv[]) {
    
    
    FILE *fp = NULL;
    fp = fopen("arr.txt","r");
    if (fp != NULL){
       while(!feof(fp)){
           char tmp = fgetc(fp);
           putchar(tmp);
       }
       printf("\n");
    }
    fclose(fp);
    
    return 0;
}


 

7).文件出错函数



 

<span style="font-size:18px;">//
//  main.c
//  15通讯录
//
//  Created by CHINGWEI_MACPC on 15/11/13.
//  Copyright © 2015年 itcast. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#define N 100 
#define NAMELEN 22
#define PHNUMLEN 12 //加上一个\0

//定义联系人结构体
typedef struct {
    
    char name[NAMELEN];
    char telNum[PHNUMLEN];
}Person;


//存储所有联系人数组
Person contacts[N];//能够存储100个联系人

//定义联系人的个数
int totalContactCount = 0;

//接收用户接收的编号
int fno ;

//定义数据文件保存的位置
char *filePath = "telbook.data";
/*******函数声明部分******/

int validateInput(int num , int min ,int max);

void doAdd();
void doDelete();
void doUpdate();
void doList();
void doSearchByName();
void doQuit();
void init();
void writeFile();
int main(int argc, const char * argv[]) {
    
    init();
    printf("通讯录初始化完成\n");
    
    while (1) {
        printf("\n");
        //软件界面显示
        printf("********************\n");
        printf("****** 欢迎使用通讯录 ******\n");
        printf("****** 1、添加联系人 ******\n");
        printf("****** 2、删除联系人 ******\n");
        printf("****** 3、修改联系人 ******\n");
        printf("****** 4、查看所有联系人 ******\n");
        printf("****** 5、搜索联系人功能 ******\n");
        printf("****** 6、退出系统 ******\n\n");
        
        printf("请输入一个编号:");
        scanf("%d",&fno);
        
        if (validateInput(fno, 1, 6)) {
            return 0;
        }
        
        
        switch (fno) {
            case 1:
                doAdd();
                break;
            case 2:
                doDelete();
                break;
            case 3:
                doUpdate();
                break;
            case 4:
                doList();
                break;
            case 5:
                //执行查找
                doSearchByName();
                break;
            case 6:
                //执行退出系统
                doQuit();
                return 0;
                break;
            default:
                break;
        }
        
    }
    
    return 0;
}
int validateInput(int num , int min ,int max){
    
    if (num < min || num > max) {
        printf("数不合法");
        return 1;
    }
    return 0 ;
}

//文档注释
/**
*  添加联系人
*/
void doAdd(){
    printf("您选择的是添加联系人,请按提示操作\n");
    
    printf("请输入联系人姓名:(*注意联系人姓名中间不能有空格)\n");
    scanf("%s",contacts[totalContactCount].name);
    
    printf("请输入联系人电话:(*注意联系人电话中间不能有空格)\n");
    scanf("%s",contacts[totalContactCount].telNum);

    int flag ; //确认添加
    printf("您确认要添加数据吗?1.确认 0.取消\n");
    scanf("%d",&flag);
    
    if (flag) {
        totalContactCount ++ ;
        
        writeFile();
    }else{
        
        
    }
}
//写数据到文件中
void writeFile(){
    FILE *fp = fopen(filePath, "wb");
    if(fp!= NULL){
        fwrite(&totalContactCount , sizeof(totalContactCount), 1, fp);
        
        for (int i = 0 ; i< totalContactCount; i++) {
            fwrite(&contacts[i], sizeof(Person), 1, fp);
        }
        
        printf("数据写入成功!\n");
        
    }
    
}
//删除
void doDelete(){
    printf("请输入一个要删除的联系人编号,请按提示操作\n");
    doList();
    int no ;
    printf("请输入要删除的联系人编号:\n");
    scanf("%d",&no);
    if (validateInput(no, 1, totalContactCount)) {
        printf("输入不合法\n");
        return ;
    }
    int flag ;
    printf("确认是否删除,删除后无法恢复,确认删除吗 1.确认 0.取消\n");
    scanf("%d",&flag);
    
    if (flag) {
        
        
        
        if (no == totalContactCount) {
            totalContactCount--;
            
        }
        else{
            for (int i = no ; i< totalContactCount; i++) {
                contacts[no-1]=contacts[no];                }
            
        }
        totalContactCount --;
    }
    writeFile();
    
    
}


//修改
void doUpdate(){
    
    printf("您选择的是修改联系人,请根据提示操作\n");
    doList();
    int no ;
    printf("请输入要修改的联系人编号:\n");
    
    scanf("%d",&no);
    
    if (validateInput(no, 1, totalContactCount)) {
        return ;
    }
    char nameTmp[NAMELEN];
    char telTmp[12];
    
    printf("输入新的联系人姓名 *注意联系人姓名不能有空格");
    scanf("%s",nameTmp);
    
    printf("输入新的电话号码 *注意联系人电话号码不能有空格");
    scanf("%s",telTmp);
    
    int flag ;
    printf("确认是更新数据,确认更新吗吗 1.确认 0.取消\n");
    scanf("%d",&flag);
    if (flag) {
        strcpy(contacts[no-1].name, nameTmp);
        strcpy(contacts[no-1].telNum, telTmp);
        writeFile();
    }
    
 
    printf("更新新的联系人和电话号码成功\n");
    
    
}



//显示
void doList(){
    printf("您选择的是显示所有联系人,联系人数据如下:\n");
    
    //判断通讯录是否为空
    if (totalContactCount == 0) {
        printf("您的通讯录还没有联系人,请添加小伙伴!\n");
    }
    else{
        printf("编号\t 姓名\t 电话\t \n");
        for (int i = 0 ; i <totalContactCount; i++) {
        
            printf("%d\t %s\t %s\t \n",i+1,contacts[i].name,contacts[i].telNum);
        }
    }
}

//通讯录初始化
//1.读取成功,说明文件存在
//2.如果存在要读取联系人数据,保存到联系人数组 contacts
//3.如果读取失败,说明我们是第一次使用通讯录
// 1)创建联系人数据文件
// 2)把当前联系人个数写入文件中
void init(){
    //定义文件指针
    FILE * fp = fopen(filePath, "r");
    if(fp != NULL){
        
        //读取联系人个数; 4字节 读完文件指针偏移
        fread(&totalContactCount, sizeof(totalContactCount), 1, fp);
        
        //读取每一个联系人
        for (int i = 0 ; i<totalContactCount; i++) {
            //读取数据到联系人数组
            fread(&contacts[i], sizeof(Person), 1, fp);
            
            
        }
    }
    else
    {
        //创建文件
        fp = fopen(filePath, "wb");
        //写入联系人个数
        fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);
        
        printf("创建通讯录文件成功\n");
    }
    //关闭文件指针
    fclose(fp);
}

//搜索
void doSearchByName(){
    printf("您选择的是搜索联系人,请按提示操作:\n");
    doList();
    char name[NAMELEN];
    printf("请输入你要查找的姓名 *名字之间不能有空格:\n");
    scanf("%s",name);
    
    int i ;
    for ( i = 0 ; i< totalContactCount; i++) {
        
        if(strcmp(name, contacts[i].name)==0)
        {
            printf("您搜索的联系人 %s 的电话号码是 :%s\n",name,
                   contacts[i].telNum);
            break;
            
        }
    }
    
    if (i == totalContactCount) {
        printf("未找到此人!\n");
    }
    
    
    
}


//退出系统
void doQuit(){
    printf("系统正在退出....\n");
    printf("系统已经退出!\n");
    
}

</span>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值