如何将内容数组写入文本文件?

How do I write an array of contents into a text file?

本文关键字:文本 文件 数组      更新时间:2023-10-16

代码应该打开一个现有的文本文件,将内容传输到数组中,然后创建一个新的文本文件,然后将数组内容写入新的文本文件中。我遇到的问题是代码仅输出新文本文件中内容的最后一行。

file.open("Patient.txt", ios::in);
while (!file.eof()) {
file >> arr[i].name >> arr[i].DOB >> arr[i].address >> arr[i].Dr_name >> arr[i].V_date;
/*cout << arr[i].name << arr[i].DOB << arr[i].address << arr[i].Dr_name << arr[i].V_date << endl;*/
}
file.close();
files.open("Patients_2.txt");
if (files.is_open()) {
for (i; i < 30; i++) {
files << arr[i].name << arr[i].DOB << arr[i].address << arr[i].Dr_name << arr[i].V_date;
}
}
files.close();
patientss.open("Patients_2.txt");
cout << "Patient 2: " << endl;
while (!patientss.eof()) {
getline(patientss, line);
cout << line << endl;
}
patientss.close();
system("pause");
return 0;
}

恕我直言,您应该重载患者类中的格式化插入和提取运算符:

struct Patient
{
std::string name;
std::string dob;
std::string address;
std::string dr_name;
std::string v_date;
friend std::istream& operator>>(std::istream& input, Patient& p);
friend std::ostream& operator<<(std::ostream& output, const Patient& p);
};
std::istream& operator>>(std::istream& input, Patient& p)
{
std::getline(input, p.name);
std::getline(input, p.dob);
std::getline(input, p.address);
std::getline(input, p.dr_name);
std::getline(input, p.v_date);
return input;
}
std::ostream& operator<<(std::ostream& output, const Patient& p)
{
output << p.name << "n";
output << p.dob << "n";
output << p.address << "n";
output << p.dr_name << "n";
output << p.v_date << "n";
return output;
}

以上使输入和输出更容易:

std::vector<Patient> database;
Patient p;
while (input_file >> p)
{
database.push_back(p);
}
const unsigned int quantity = database.size();
for (unsigned int i = 0; i < quantity; ++quantity)
{
output_file << database[i];
}

上面的代码还支持封装和数据隐藏的概念。Patient struct负责或读取其成员,因为它知道成员的数据类型。Patient外部的代码只关心Patient实例的输入和输出(不关心内部)。

这个循环有几个问题:

while (!file.eof()) {
file >> arr[i].name >> arr[i].DOB ....
  • 您永远不会增加i因此相同的arr[i]将一次又一次地被覆盖。
  • 您可以使用!file.eof()作为停止阅读的条件。eof()直到您尝试读取文件末尾之后才会设置,这意味着如果您按应有的方式增加了i最后一个arr将是空的/损坏的。而是检查从流中提取是否成功。由于在执行stream >> var时返回,并且explicit operator bool() const的重载返回!fail()因此您可以直接在循环中执行此检查:
    while(stream >> var) { extraction success }

然而,对可能包含空格的字符串字段使用格式化输入(>>)不是一个好主意。你的名字,nung khual,将被拆分,所以nung会进入namekhual会进入DOB。最好使用不太可能包含在任何人名称中的字段分隔符。n通常很好,并且与std::getline配合得很好。

std::getline返回您作为参数给出的,这意味着您可以像stream >> var1 >> var2类似地链接getline,只是它更详细一些。
getline(getline(stream, var1), var2)将第一行放在var1中,第二行放在var2中。

若要简化输入和输出,可以为数据类型添加流运算符,并使输入流运算符对字段使用getline

例:

#include <fstream>
#include <iostream>
#include <string>
#include <vector>
struct data_t {
std::string name;
std::string DOB;
std::string address;
std::string Dr_name;
std::string V_date;
};
// input stream operator using chained getlines
std::istream& operator>>(std::istream& is, data_t& d) {
using std::getline;
return getline(getline(getline(getline(getline(is,
d.name), d.DOB), d.address), d.Dr_name), d.V_date);
}
// output stream operator
std::ostream& operator<<(std::ostream& os, const data_t& d) {
return os << d.name << 'n'
<< d.DOB << 'n'
<< d.address << 'n'
<< d.Dr_name << 'n'
<< d.V_date << 'n';
}
int main() {
std::vector<data_t> arr;
if(std::ifstream file("Patient.txt"); file) {
data_t tmp;
while(file >> tmp) {                           // remember, no eof() needed
arr.push_back(tmp);
}
}
if(std::ofstream file("Patients_2.txt"); file) {
for(const data_t& d : arr) {
file << d;
}
}
if(std::ifstream patientss("Patients_2.txt"); patientss) {
data_t tmp;
while(patientss >> tmp) {
std::cout << tmp;
}
}
}