嵌入式初学-C语言-二八

#接嵌入式初学-C语言-二七#

文件的操作

单字符写入

  1. 函数名:fputc
  2. 头文件:#include <stdio.h>
  3. 函数原型:int fputc(int c,FILE*fp)
  4. 函数功能:向fp代表的文件中写入一个字符c
  5. 函数参数
    1. C:待写入的字符
    2. Fp:已经打开的文件指针
  6. 返回值
    1. 成功:返回字符c
    2. 失败:返回EOF(-1)

案例:

/**
* 单字符写入
*/
#include <stdio.h>
int main(int argc,char **argv)
{
if(argc < 3)
{
printf("输入有误,请按照<%s 文件路径 文本数据>格式输入\n",argv[0]);
return -1;
}
FILE* fp = fopen(argv[1],"w");
if(!fp)
{
perror("文件打开失败!");
return -1;
}
// 单字符写入
while(*argv[2] != '\0')
{
// ./a.out file1.txt I_Love_Your
fputc(*argv[2],fp);
argv[2]++;// 指针偏移1位
}
fclose(fp);
return 0;
}

 

多字符写入

  1. 函数名:fputs
  2. 头文件:#include <stdio.h>
  3. 函数原型:int fputs(const char*s,FILE*fp)
  4. 函数功能:向fp代表的文件中写入一个字符串s
  5. 函数参数
    1. C:待写入的字符数组(写入缓冲区)
    2. Fp:已经打开的文件指针
  6. 返回值
    1. 成功:返回非负整数(>0)
    2. 失败:返回EOF(-1)

案例: 

/**
* 多字符写入
*/
#include <stdio.h>
int main(int argc,char **argv)
{
if(argc < 3)
{
printf("输入有误,请按照<%s 文件路径 文本数据>格式输入\n",argv[0]);
return -1;
}
FILE* fp = fopen(argv[1],"w");
if(!fp)
{
perror("文件打开失败!");
return -1;
}
// 单字符写入
// ./a.out file1.txt I_Love_Your
fputs(argv[2],fp);
fclose(fp);
return 0;
}

 

判文件结束函数

  1. 函数名:feof()
  2. 头文件:#include <stdio.h>
  3. 函数原型:int feof(fp)
  4. 函数功能:在读fp指向的文件时判断是否遇到文件结束。
  5. 函数参数
    1. fp:已打开的文件指针
  6. 返回值
    1. 文件结束:返回非0

案例:

/**
* feof案例:将一个磁盘文件中的信息复制到另一个磁盘文件中。
*/
#include <stdio.h>
#include <string.h>
int main(int argc,char** argv)
{
// main函数输入判断
if(argc < 3)
{
printf("输入有误,请按照<%s 源文件路径 目标文件路径>格式输入\n",argv[0]);
return -1;
}
// 打开文件
FILE* in = fopen(argv[1],"r");
FILE* out = fopen(argv[2],"w");
// 校验
if(!in || !out)
{
perror("文件打开失败!");
return -1;
}
// 单个字符读写
// while(!feof(in))
// {
// 读写操作
// fputc(fgetc(in),out);
//}
// 多个字符读写
// 创建一个缓冲区,用来存放读写的数据
char buf[64] = {0};
// 使用循环读写文件
while(fgets(buf,64,in)!=NULL)
{
// 写入数据
fputs(buf,out);
// 重置缓冲区
memset(buf,0,sizeof(buf));
}
printf("\n");
// 关闭文件
fclose(in);
fclose(out);
}

 

多字符写入

函数名:fputs

头文件: #include

函数原型: int fputs(const char *buf, FILE *fp);

函数功能:向fp代表的文件中写入一个字符数组s

函数参数:

        s:待写入的字符数组(写入缓冲区)

        fp:已打开的文件指针

返回值:

        成功:返回非负整数 (> 0)

        失败:返回EOF(-1)  

案例:

/**
* feof案例:将一个磁盘文件中的信息复制到另一个磁盘文件中。
*/
#include <stdio.h>
#include <string.h>
int main(int argc,char** argv)
{
// main函数输入判断
if(argc < 3)
{
printf("输入有误,请按照<%s 源文件路径 目标文件路径>格式输入\n",argv[0]);
return -1;
}
// 打开文件
FILE* in = fopen(argv[1],"r");
FILE* out = fopen(argv[2],"w");
// 校验
if(!in || !out)
{
perror("文件打开失败!");
return -1;
}
// 单个字符读写
// while(!feof(in))
// {
// 读写操作
// fputc(fgetc(in),out);
//}
// 多个字符读写
// 创建一个缓冲区,用来存放读写的数据
char buf[64] = {0};
// 使用循环读写文件
while(fgets(buf,64,in)!=NULL)
{
// 写入数据
fputs(buf,out);
// 重置缓冲区
memset(buf,0,sizeof(buf));
}
printf("\n");
// 关闭文件
fclose(in);
fclose(out);
}

 

数据块的读写(二进制)

fread
  1. 头文件:#include <stdio.h>
  2. 函数原型:size_t fread(void *ptr,size_t size,size_t count,FILE* fp)
  3. 函数功能:从fp代表的文件中以size为单位读取count个存放在prt内存中
  4. 函数参数:
    1. Prt:内存空间首地址,用于存放读取到的数据(缓冲区)
    2. Size:数据块大小,以byte为单位
    3. Count:待读取的数据块的个数
    4. Fp:以打开的文件指针、
  5. 返回值
    1. 成功:返回实际写入的字节数
    2. 失败:返回<0

案例:

/**
* 数据库读写案例:将二进制文件stu-list中的学生信息读出来。
*/
#include <stdio.h>
#define SIZE 4
// 创建学生结构体
struct Student
{
char name[20];
int num;
int age;
char addr[50];// 住址
} stud[SIZE];
void main()
{
int i;
FILE* fp;
if((fp = fopen("stu-list","rb")) == NULL)
{
perror("文件打开失败!");
return;
}
// 循环读取二进制文件
for(i = 0; i < SIZE; i++)
{
fread(&stud[i],sizeof(struct Student),1,fp);
// 将读到的内容输出到控制台
printf("%-10s%4d%4d%-20s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
fclose(fp);
}
fwrite
  1. 头文件:#include <stdio.h>
  2. 函数原型:size_t fwrite(const void *ptr,size_t  size , size_t  count , FILE* fp)
  3. 函数功能:向fp代表的文件中以size为一个数据块,写入count个数据块到fp
  4. 函数参数:
  5. Ptr:内存空间首地址,用于存放待写入的数据(写入缓冲区)
  6. Size:数据块大小,以byte为单位
  7. Count:待写入的数据块的个数
  8. Fp:以打开的文件指针
  9. 返回值
    1. 成功:返回实际写入的字节数
    2. 失败:返回<0

案例:

/**
* 数据库读写案例:从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去。
*/
#include <stdio.h>
#define SIZE 4 // 学生数量
// 创建学生结构体
struct Student
{
char name[20];
int num;
int age;
char addr[50];// 住址
} stud[SIZE];
// 保存学生信息到文件
void save()
{
FILE* fp;
int i;
if((fp = fopen("stu-list","wb")) == NULL)// stu-list对应的目录:./stu-list,wb-二进制写
入,默认是文本写入
{
perror("文件打开失败!");
return;
}
// 写入操作
for(i = 0; i < SIZE; i++)
{
fwrite(&stud[i],sizeof(struct Student),1,fp);
}
// 关闭文件
fclose(fp);
}
void main()
{
int i;
printf("请输入学生的信息:姓名,学号,年龄,住址\n");
for(i = 0; i < SIZE;i++)
{
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
// 录入一个学生,就保存一个学生到文件中
save();
}
}

文件的随机读写

说明:C语言允许程序员在读写文件内容时,可在指定的位置上读写数据

文件随机读写的核心操作: 文件位置指针的定位

文件位置指针的移动方法:

rewind

头文件: #include

函数原型: void rewind(FILE* fp);

函数功能: 将文件位置指针定位到文件开头

函数参数:

        fp: 已经打开的文件指针

返回值: 无

fseek

头文件: #include

函数原型: int fseek(FILE *fp, long offset, int whence);

函数功能: 将文件位置指针定位到指定位置

函数参数:

        fp: 已经打开的文件指针

        offset: 相对于参考位置的偏移位置

        whence: 参考位置

                SEEK_SET 或 0 表示文件头

                SEEK_CUR 或 1 表示当前读写的位置

                SEEK_END 或 2 表示文件尾

返回值:

        成功 :0

        失败 : -1

ftell

头文件: #include

函数原型: long ftell(FILE *fp);

函数功能: 获取文件位置指针当前位置

函数参数:

        fp: 已经打开的文件指针

返回值:

        成功 :文件位置指针当前位置

        失败 : -1  

案例1:

/**
* 有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。
*/
#include <stdio.h>
void main()
{
FILE *fp1, *fp2;
fp1 = fopen("file1.c", "r");
fp2 = fopen("file2.c", "w");
while (!feof(fp1))
putchar(getc(fp1)); /*输出到屏幕*/
rewind(fp1); /*位置指针返回到文件头*/
while (!feof(fp1))
putc(getc(fp1), fp2); /*从文件file1的头读起,输出到文件file2中*/
fclose(fp1);
fclose(fp2); /*关闭文件*/
}

案例2:

/**
* 在磁盘文件上存有10个学生的数据。要求将第1、3、5、7、9个学生数据输入计算机,并在屏幕上显示出来。
*/
#include <stdlib.h>
#include <stdio.h>
struct student_type
{
char name[10];
int num;
int age;
char sex;
} stud[10];
void main()
{
int i;
FILE *fp;
if ((fp = fopen("stud-dat", "rb")) == NULL)
{
printf("can not open file\n");
return;
}
for (i = 0; i < 10; i += 2)
{
fseek(fp, i * sizeof(struct student_type), 0);
fread(&stud[i], sizeof(struct student_type), 1, fp);
printf("%s %d %d %c\n", stud[i].name, stud[i].num, stud[i].age, stud[i].sex);
}
fclose(fp);
}

案例3:

/**
* 下列C程序的功能是,用“追加”的形式打开文件gg.txt,查看文件读写指针的位置,然后向文件写入“data”,
再查看
文件读写指针的位置。
*/
#include "stdio.h"
main()
{
long p;
FILE *fp;
if ((fp = fopen("gg.txt","a")) == NULL)
{
printf("cannot open this file!\n");
return;
}
p = ftell(fp);
printf("p=%ld\n",p);
fputs("data", fp);
p = ftell(fp);
printf("p=%ld\n",p);
fclose(fp);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值