C++中double类型的数据在文本写入时是以字符形式写入的,而不是以二进制形式。所以double的值会被转换成字符串并以字符形式写入文件。对于你遇到的问题,写入函数中确实忘记在score后添加空格,导致第一条记录的成绩90与第二条记录的学号PB01210202粘在一起。程序在读取文件时并不知道应该在哪里截断这两者,因为在文件中它们没有分隔符。
这就是为什么在写入文件时要确保使用适当的分隔符来分隔不同的字段。
解决办法:
- 在写入文件时,确保在学号和成绩之间添加适当的分隔符,例如空格。
- 在读取文件时,使用相同的分隔符来分隔不同的字段。
下面是修改后的代码示例:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct StudentRecord {
string number;
double score;
};
void writeToFile(const string& filename, const StudentRecord& record) {
ofstream wsr(filename, ios::app);
if (wsr.is_open()) {
wsr << record.number << " " << record.score << endl; // 添加空格并换行
wsr.close();
} else {
cout << "Unable to open file for writing." << endl;
}
}
void readFromFile(const string& filename) {
ifstream rsr(filename);
if (rsr.is_open()) {
string number;
double score;
while (rsr >> number >> score) {
cout << "Number: " << number << ", Score: " << score << endl;
}
rsr.close();
cout << "Unable to open file for reading." << endl;
int main() {
StudentRecord record1 = {"PB01210201", 90.0};
StudentRecord record2 = {"PB01210202", 85.5};
writeToFile("stud.txt", record1);
writeToFile("stud.txt", record2);
readFromFile("stud.txt");
return 0;
这个修改后的代码在写入文件时确保了在学号和成绩之间添加了空格,并在读取文件时使用了相同的空格来分隔不同的字段。这样就可以正确地读取并显示记录了。
通过在写入文件时使用适当的分隔符(在这里是空格),你确保了每个字段之间有一个可识别的分隔符,这有助于在读取文件时正确解析数据。分隔符的选择通常根据数据的特性来确定,只要在写入和读取时保持一致即可。
在上面的代码中,wsr << record.number << " " << record.score << endl;这一行确保了在每个记录的学号和成绩之间有一个空格,并在记录之间换行,使文件更易读。
在while (rsr >> number >> score)这一行,>>操作符会根据文件中的空格来分隔不同的字段,因此它能够正确地读取学号和成绩,并将它们存储在相应的变量中。
你可以确保在文本文件中存储的数据以一种结构化的方式存在,使得读取和处理数据更加容易。你也可以选择其他的分隔符,例如逗号、制表符等,取决于你的需求和数据的特性。只需确保在写入和读取时使用相同的分隔符,以保持数据的一致性。