c 文件操作

 

 

 

 

#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;
}

  

 

posted @ 2026-02-22 14:43  巨兽~墨菲特  阅读(26)  评论(0)    收藏  举报