#include <stdio.h>
#include <stdlib.h> // 添加exit函数的头文件
void demo01()
{
FILE* fp;
char ch, FileName[20];
printf("请输入所用的文件名:");
//scanf_s("%s", FileName, (unsigned)_countof(FileName)); // scanf_s需要指定缓冲区大小\/
/**
将scanf换成scanf_s
但是,scanf_s函数只能在vs上使用,其他平台无法使用,故修改后代码无法移植,不建议
*/
scanf("%s", FileName);
/*if ((fp = fopen_s(FileName, 'w')) == NULL)
{
printf("无法打开此数据文件、\n");
exit(0);
}*/
// 修正fopen_s的使用
if (fopen_s(&fp, FileName, "w") != 0) // fopen_s正确用法
{
printf("无法打开此数据文件\n");
exit(0);
}
ch = getchar();
printf("请和收入字符串(一# 结束):");
ch = getchar();
while (ch != '#')
{
fputc(ch, fp);
putchar(ch);
ch = getchar();
}
fclose(fp);
// putchar(10);
}
void demo02()
{
FILE* fp;
char str[1024];
fp = fopen("demo.txt", "r");
if (fp == NULL)
printf("打开文件失败");
else
printf("打开文件成功");
while (!feof(fp))
{
// printf("大小:%d", sizeof(str));
if (fgets(str, sizeof(str), fp) != NULL)
printf("\n 读取文件数据如下:\n %s", str);
}
}
struct student
{
int no;
char name[10];
};
void demo03()
{
struct student st[2] = {
{101,"张三"},
{102,"李四"}
};
FILE* fp = fopen(".\\studentdata.txt", "w");
if (fp == NULL)
{
perror("open file fail\n");
exit(1);
}
fwrite(st, sizeof(struct student), 2, fp);
fclose(fp);
}
void demo04()
{
FILE* fp = fopen(".\\studentdata.txt", "r");
if (fp == NULL)
{
perror("open file fail\n");
exit(1);
}
struct student st[2];
fread(st,sizeof(struct student), 2,fp);
printf("No:%d \t Name:%s\n", st[0].no, st[0].name);
printf("No:%d \t Name:%s\n", st[1].no, st[1].name);
//int i;
for (int i = 0; i < 2; i++)
{
printf("%d\n", i);
printf("No:%d \t Name:%s\n", st[i].no, st[i].name);
}
fclose(fp);
}
void demo05()
{
FILE* fpold, * fpnew;
fpold = fopen("old.dat", "r");
fpnew = fopen("new.dat", "w");
// 检查文件是否成功打开
if (fpold == NULL || fpnew == NULL) {
printf("文件打开失败!\n");
exit(1);
}
/*while (!feof(fpold))
putchar(getc(fpold));*/
int ch; // 使用 int 类型,因为 EOF 是 int 类型
while ((ch = getc(fpold)) != EOF) {
putchar(ch);
}
printf("\n");
// rewind(!feof(fpold));
/*
rewind(!feof(fpold)) 错误
!feof(fpold) 返回的是布尔值(0或1),而不是文件指针
应该直接使用 rewind(fpold)
**/
rewind(fpold);
/*while (!feof(fpold))
putc(getc(fpold), fpnew);*/
while ((ch = getc(fpold)) != EOF) {
putc(ch, fpnew);
}
fclose(fpold);
fclose(fpnew);
}
int main()
{
demo05();
return 0;
}