题目
本题是谭浩强《C程序设计课后习题》题10.10。
题目:
从第9题的“职工工资文件”中删去一个职工的数据,再存回原文件。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj
一、解题思路
思路:
编者研究这道题已经找了一个多小时的bug,心态已经崩了,然后发现代码没有任何问题,是电脑汉字编码的问题导致读txt文件的汉字字符串输出乱码,问题现在已经解决,大家有相同类似状况请查看这一篇博客:https://blog.csdn.net/lwj8819/article/details/119610667
具体思路大家看代码就能理解,使用输入的信息如果和文件中匹配,就跳过不拷贝的方式来删除输入的信息这一思想。
if (strcmp(name, es[j].name) == 0)
continue;//如果相等,就不写进去
fprintf(fp, “%s %d\n”, es[j].name, es[j].salary);//如果不相等,就写入文件指针
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.主函数部分
代码如下(示例):
typedef struct emp_salary
{
char name[32];
int salary;
}emp_salary;
int main()
{
emp_salary es[100];
FILE* fp = fopen("emp_salary.txt", "r");
if (fp == NULL)
{
printf("open emp_salary errl!\n");
return -1;
}
int i = 0;
printf("源文件中的数据为:\n");
while (!feof(fp))
{
int count = fscanf(fp,"%s %d", es[i].name, &es[i].salary);
if (count == -1)
break;//如果fscanf返回的值为-1说明读取失败。
printf("%s %d\n", es[i].name, es[i].salary);
i++;
}
fclose(fp);
char name[32] = { 0 };//输入名字进行删除
printf("请输入要删除的职工名字:>");
scanf("%s", name);
fp = fopen("emp_salary.txt", "w");
if (fp == NULL)
{
printf("open emp_salary errl!\n");
return -1;
}
for (int j = 0; j < i; j++)
{
if (strcmp(name, es[j].name) == 0)
continue;//如果相等,就不写进去
fprintf(fp, "%s %d\n", es[j].name, es[j].salary);
}
fclose(fp);
return 0;
}
三、执行结果
输入:
张三 6000
李四 6000
王五 6000
麻子 6000
大白 6000
输出:
张三 6000
李四 6000
王五 6000
大白 6000