C++读取data.txt并计算存储至newData.txt技术求助
嘿,你已经迈出了第一步——成功读取文件内容啦!接下来要完成计算薪资并写入新文件的需求,这里给你一些实用的参考方向和具体的实现建议:
一、核心知识点参考
这些都是C++标准库内置的功能,不用额外找外部资源,直接查对应库的用法就行:
- 文件写入操作:重点掌握
<fstream>里的ofstream类,它和你已经在用的ifstream用法类似,用来创建并写入文件。 - 结构化数据读取:你的数据是每组4个元素(名、姓、薪资、涨幅百分比),与其逐词读取,不如直接按组读取四个值,这样逻辑更清晰,效率也更高。
- 数值计算细节:注意整数除法的坑!比如涨幅是5代表5%,计算时要转成
0.05再和薪资相乘,不然整数除法会得到0,结果就错了。
二、修改后的完整代码示例
我把你的代码扩展成了能完成全部需求的版本,注释很详细,你可以直接参考:
#include <iostream> #include <string> #include <fstream> #include <cstdlib> #include <iomanip> // 如果需要控制小数精度的话 using namespace std; int main() { const string inputFilename = "data.txt"; const string outputFilename = "newData.txt"; // 打开输入文件 ifstream infile(inputFilename); if (!infile.is_open()) { cerr << "无法打开输入文件 " << inputFilename << endl; exit(EXIT_FAILURE); } // 打开输出文件 ofstream outfile(outputFilename); if (!outfile.is_open()) { cerr << "无法创建输出文件 " << outputFilename << endl; infile.close(); // 记得关闭已打开的输入文件 exit(EXIT_FAILURE); } string firstName, lastName; int salary, increment; // 按组读取数据:>> 会自动跳过空格、换行等空白字符 while (infile >> firstName >> lastName >> salary >> increment) { // 计算更新后的薪资:把涨幅百分比转成小数 double updatedSalary = salary * (1 + increment / 100.0); // 写入新文件,这里用换行分隔每组数据,也可以换成逗号等分隔符 // 如果需要控制小数位数,比如保留2位,可以加上 fixed 和 setprecision outfile << firstName << " " << lastName << " " << fixed << setprecision(2) << updatedSalary << endl; // 可选:在控制台打印结果,方便验证 cout << firstName << " " << lastName << " " << fixed << setprecision(2) << updatedSalary << endl; } // 记得关闭文件,虽然程序结束时会自动关闭,但手动关闭是好习惯 infile.close(); outfile.close(); cout << "处理完成!结果已经保存到 " << outputFilename << endl; system("pause"); return 0; }
三、额外的实用参考要点
- 错误处理优化:如果想知道文件打不开的具体原因,可以用
perror()函数(需要包含<cstdio>头文件),比如perror("打开输入文件失败");,它会输出更详细的系统错误信息。 - 数据格式兼容性:不管你的
data.txt里是一行存所有数据还是每行存一组,while(infile >> ...)的写法都能正常工作,因为>>操作符会自动跳过所有空白字符。 - 精度控制:如果不需要小数,或者想调整小数位数,修改
setprecision的参数就行,比如setprecision(0)就是整数形式。
内容的提问来源于stack exchange,提问作者gymcode
相关产品推荐
相关产品推荐

