重要总结
字符函数大总结
关于文件的注意点
文件读取个人见解
值得说明的是,虽然 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问题