常见的文件问题

重要总结

字符函数大总结
关于文件的注意点
文件读取个人见解
值得说明的是,虽然 gets()、fgets()、puts()、fputs() 都是字符串处理函数,但它们都包含在 stdio.h 头文件中,并不是包含在 string.h 头文件中。

1.转换字符串大小写后输出到指定文件

#include<stdio.h>
int main()
{
	char str[100];
	printf("输入一个字符串!\n");
	gets_s(str, 100);
	FILE *p;
	if ((p = fopen("E:\\Dream code\\hh.txt", "w+")) == NULL)
	{
		printf("文件出错!!\n");
		return 0;
	}
	int i = 0;
	while (str[i] != '\0')
	{
		if (str[i] >= 'A'&&str[i] <= 'Z')
			str[i] = str[i] + 32;
		else if(str[i] >= 'a'&&str[i] <= 'z')
			str[i] = str[i]-32;
		i++;
	}
	fputs(str, p);
	return 0;
}

2.结构体数据的文件写入问题

#include<stdio.h>
typedef struct
{
	float grade[3];
	char no[15];//学号
	char name[20];//姓名
}Student;
int main()
{
	FILE *p;
	Student student[5];
	Student student1[5];
	float average = 0;
	float average1 = 0;
	int i = 0;
	if ((p = fopen("E:\\Dream code\\stud.txt", "w+")) == NULL)
	{
		printf("文件出错!\n");
		return 0;
	}
	for (i; i < 5; i++)
	{
		printf("依次输入第%d个同学的姓名、学号、三门成绩,用空格隔开:\n", i + 1);
		scanf("%s", student[i].name);
		getchar();
		scanf("%s", student[i].no);
		getchar();
		scanf("%f%f%f", &student[i].grade[0], &student[i].grade[1], &student[i].grade[2]);
		getchar();
		average = (student[i].grade[0] + student[i].grade[1] + student[i].grade[2]) / 3;
		fprintf(p, "%s %s %f %f %f %f\n", student[i].name, student[i].no, student[i].grade[0], student[i].grade[1], student[i].grade[2], average);
	}
	printf("文件写入完毕!\n");
	i = 0;
	rewind(p);
	while (!feof(p))
	{
		fscanf(p, "%s %s %f %f %f %f\n", student1[i].name, student1[i].no, &student1[i].grade[0], &student1[i].grade[1], &student1[i].grade[2], &average1);
		if(!ferror(p))
		  printf("%s %s %f %f %f %f\n", student1[i].name, student1[i].no, student1[i].grade[0], student1[i].grade[1], student1[i].grade[2], average1);
		i++;
	}
	fclose(p);
}

提问:为什么在以下代码段中feof并没有多一次判断?

while (!feof(p))
	{
		fscanf(p, "%s %s %f %f %f %f\n", student1[i].name, student1[i].no, &student1[i].grade[0], &student1[i].grade[1], &student1[i].grade[2], &average1);
		if(!ferror(p))
		  printf("%s %s %f %f %f %f\n", student1[i].name, student1[i].no, student1[i].grade[0], student1[i].grade[1], student1[i].grade[2], average1);
		i++;
	}

答:注意fscanf中的’\n’,在读第五段数据时,假设第五段数据为
柴 001 100 100 100\nEOF,当读完最后一个100时,文件指针在\n的前面,请记住,在scanf中出现‘\n’并不是指的等待\n输入后程序就会结束,而是会忽略后续一系列空白字符,直至到一个非空白字符他才会结束,所以在这里,文件指针会继续往后走…一直到了EOF前面,出现了非空白字符,于是文件指针移至EOF后面(文件指针p撞上了EOF),所以下次feof判断则会正常退出循环,甚至如果scanf最后一个格式控制符后面加入个空格也能起到\n的同样效果,但是若fscanf中无\n则会多进入一次循环,很简单,由于scanf中无\n,所以在读完最后一个100后,文件指针不会继续移动去忽略后续空白字符,直接进行下一次feof判断,此时文件指针后面为\n,所以会在进入一次循环,更多详解看\n问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值