文件操作
打开文件
#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个字符