如何将内容数组写入文本文件?
How do I write an array of contents into a text file?
代码应该打开一个现有的文本文件,将内容传输到数组中,然后创建一个新的文本文件,然后将数组内容写入新的文本文件中。我遇到的问题是代码仅输出新文本文件中内容的最后一行。
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
会进入name
,khual
会进入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;
}
}
}
相关文章:
- 文本文件中的单词链表
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何在c++中从文本文件中逐行读取整数
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- C++试图读取一个文件并输出到另一个文本文件
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 已修改的LinkedList未在文本文件本身中更新
- C++文本文件的获取线
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 打印逐行存储的文本文件
- C++文本文件输入