C语言(谭浩强版本,主讲人:小甲鱼)P59-P60

文件操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打开文件

#include<stdio.h>
void main()
{
	FILE* fp;
	if ((fp = fopen("H:\\FishC\\a1.txt", "r")))
	{
		printf("打开成功\n");
	}
	else
	{
		printf("该文件不存在!\n");
		system("pause");
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

写入数据

#include<stdio.h>
void main()
{
	FILE* fp;
	char ch;//句子
	char filename[20];//文件名
	printf("请输入文件的名称:");
	scanf("%s", filename);
	if ((fp = fopen(filename, "wt+")))//w:读写打开或者建立一个文件文本,允许读写
	{
		printf("请输入你想要的句子:\n");
		ch = getchar();//第一个消料掉上一次scanf最后的回车键
		ch = getchar();
		while (ch != EOF)//EOF=Ctrl+Z
		{
			fputc(ch, fp);
			ch = getchar();//循环输入句子
		}
	}
	else
	{
		printf("打开错误!\n");
		exit(0);//退出程序
	}
	fclose(fp);//关闭文件
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

读取数据

#include<stdio.h>
void main()
{
	FILE* fp;
	char ch;
	char filename[20];//文件名
	printf("请输入文件的名称:");
	scanf("%s", filename);
	if (!(fp = fopen("a1.txt", "r")))//r:
	{
		printf("打开错误!\n");
		exit(0);//退出程序
	}
	ch = fgetc(fp);//读取文件内容
	while (ch != EOF)// while (!feof(fp));
	{
		putchar(ch);//循环输出句子 
		ch = fgetc(fp);//读取文件内容
	}
	fclose(fp);//关闭文件
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
	FILE* f_pic,*f_file,*f_finish;
	char photo_name[20], file_name[20], finish_name[20];
	char ch;
	printf("请输入需要合成的图片和文件的名称:\n");
	printf("图片:");
	scanf("%s", photo_name);
	printf("文件:");
	scanf("%s", file_name);
	printf("生成为:");
	scanf("%s", finish_name);
	if (!(f_pic = fopen(photo_name, "rb")))//rb:(只读)以二进制的文件读取
	{
		printf("打开图片错误!\n");
		return;
	}
	if (!(f_file = fopen( file_name, "rb")))//rb:(只读)以二进制的文件读取
	{
		printf("打开文件错误!\n");
		return;
	}
	if (!(f_finish = fopen(finish_name, "wb")))//wb:(只写)以二进制的文件写入
	{
		printf("写入文件错误!\n");
		return;
	}

	while (!feof(f_pic))
	{
		ch = fgetc(f_pic);//读取文件内容
		fputc(ch, f_finish);//写入文件
	}
	fclose(f_pic);//关闭文件

	while (!feof(f_file))
	{
		ch = fgetc(f_file);//读取文件内容
		fputc(ch, f_finish);//写入文件
	}
	fclose(f_file);//关闭文件
	fclose(f_finish);//关闭文件

	system("pause");
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

读取数据

#include<stdio.h>
#include<stdlib.h>
#define LEN 12//I Love You!一共11个字符在加上'\0'等于12个字符
void main()
{
	FILE* fp;
	char buffer[LEN];
	if (!(fp = fopen("a1.txt", "rt")))//rt:(只读)打开一个文本文件
	{
		printf("打开文件失败");
		exit(1);
	}
	else
	{
		fgets(buffer, LEN, fp);
		printf("%s\n", buffer);
	}
	fclose(fp);
}
//I Love You!

在这里插入图片描述

写入数据并读取数据

#include<stdio.h>
#include<stdlib.h>
#define LEN 20
void main()
{
	FILE* fp;
	char buffer[LEN];
	char ch;
	if (!(fp = fopen("a1.txt", "at+")))//at+:读写打开一个文本文件,允许读或在文本末追加数据。
	{
		printf("打开文件失败");
		exit(1);
	}
	else
	{
		//写入数据
		fgets(buffer, LEN, stdin);
		//为什么不以scanf()来输入内容到数组? 答:因为使用scanf()来输入字符串会不接受空格
		//stdin又是什么? 答:键盘输入内容
		fputs(buffer, fp);

		//读取数据
		rewind(fp);//重新定义文件内部指针去到开头处
		ch = fgetc(fp);
		while (ch != EOF)
		{
			putchar(ch);
			ch = fgetc(fp);
		}
		
		//也可以这样读取数据,不过智能读取一行
		//rewind(fp);//重新定义文件内部指针去到开头处
		//fgets(buffer, LEN, fp);
		//printf("%s\n", buffer);
	}
	fclose(fp);//关闭文件
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

写入数据(二进制),不仅可写入二进制文件,文本文件也可以

#include<stdio.h>
#include<stdlib.h>
#define SIZE 4

struct student
{
	char name[100];//姓名
	int num;//学号
	int age;//年龄
	char addr[15];//地址
}stu[SIZE];

void save()
{
	FILE* fp;
	if (!(fp = fopen("a2", "wb")))//二进制文件不需要后缀名,wb:(只写)为输出打开一个二进制文件
	{
		printf("文件错误");
		return;
	}
	for (int i = 0; i < SIZE; i++)
	{
		if (fwrite(&stu[i], sizeof(struct student), 1, fp) != 1)
		{
			printf("文件写入错误");
			fclose(fp);
		}
	}
}
void main()
{
	printf("请分别输入4个学生的姓名、学号、年龄、地址:\n");
	for (int i = 0; i < SIZE; i++)
	{
		scanf("%s %d %d %s", stu[i].name, &stu[i].num, &stu[i].age, stu[i].addr);
	}
	save();
}

在这里插入图片描述
在这里插入图片描述

读取数据(二进制)

#include<stdio.h>
#include<stdlib.h>
#define SIZE 4

struct student
{
	char name[100];//姓名
	int num;//学号
	int age;//年龄
	char addr[15];//地址
}stu[SIZE];
void load()
{
	FILE* fp;
	if (!(fp = fopen("a2", "rb")))//rb:(只读)为输入打开一个二进制文件
	{
		printf("文件错误");
		return;
	}
	for (int i = 0; i < SIZE; i++)
	{
		if (fread(&stu[i], sizeof(struct student), 1, fp) != 1)
		{
			printf("文件读取错误");
			fclose(fp);
		}
	}
}
void main()
{
	load();
	for (int i = 0; i < SIZE; i++)
	{
		printf("%s %d %d %s\n", stu[i].name, stu[i].num, stu[i].age, stu[i].addr);
	}
}

在这里插入图片描述
在这里插入图片描述

写入数据

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE* fp;

    if (!(fp = fopen("a1.txt", "w+")))
    {
        printf("文件错误");
        return;
    }
    fprintf(fp, "%s %s %s %d", "We", "are", "in", 2021);
    fclose(fp);

    return(0);
}

在这里插入图片描述

读取数据

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char str1[10], str2[10], str3[10], str4[10];
    int year;
    FILE* fp;
    //打开文件
    fp = fopen("a1.txt", "w+");
    //写入数据,使用空格分割数据
    fputs("We are in 2021 2", fp);

    rewind(fp);//鼠标移至文件头
    //读取数据,以空格为一个单位输出
    fscanf(fp, "%s %s %s %s %d ", str1, str2, str3, str4, &year);

    printf("%s\n", str1);
    printf("%s\n", str2);
    printf("%s\n", str3);
    printf("%s\n", str4);
    printf("%d\n", year);

    fclose(fp);

    return(0);
}
//We
//are
//in
//2021
//2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>

struct student
{
	char name[100];//姓名
	int num;//学号
	int age;//年龄
	char addr[15];//地址
}boy;

void main()
{
	FILE* fp;
	int i = 1;
	if (!(fp = fopen("a2", "rb")))//rb:(只读)为输入打开一个二进制文件
	{
		printf("文件错误");
		return;
	}
	rewind(fp);//鼠标指向文件头
	fseek(fp, i * sizeof(struct student), 0);
	fread(&boy, sizeof(struct student), 1, fp);
	printf("%s %d %d %s", boy.name, boy.num, boy.age, boy.addr);
}
//小花 2 15 汕尾

在这里插入图片描述

#include <stdio.h>

int main()
{
    FILE* fp;
    int len;

    if(!(fp = fopen("a1.txt", "r")))
    {
        perror("打开文件错误");
        return;
    }
    fseek(fp, 0, 2);
    len = ftell(fp);
    fclose(fp);

    printf("a1.txt 的总大小 = %d 字节\n", len);

    return(0);
}
//a1.txt 的总大小 = 16 字节 (We are in 2021 2)一共16个字符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值