更新文件(c++)中的记录
update records in file (c++)
我想问如何将字符串附加到固定行数(固定位置)的末尾。我试着在书和网站上搜索我的答案,但我找不到我做错了什么。
我的结构:
const int numberofdays=150 ;
const int numberofstudents=2;
struct students
{
char attendance[numberofdays]; int rollno;
char fullname[50],fathersname[50];
}
创建文本文件
ofstream datafile("data.txt", ios::out );
然后我接受用户的输入并将其保存到文件中。
如何将数据保存到文本文件:
datafile <<attendance <<endl<< rollno <<endl<<
fullname <<endl<< fathersname <<endl ;
文本文件中的外观:
p // p for present - 1st line
1 // roll number
Monte Cristo // full name
Black Michael // Fathers name
a // a for absent - 5th line
2 // roll number
Johnson // full name
Nikolas // Fathers name
如何尝试更新文件。(每天更新考勤)
datafile.open("data.txt", ios::ate | ios::out | ios::in);
if (!datafile)
{
cerr <<"File couldn't be opened";
exit (1);
}
for (int i=1 ; i<=numberofstudents ; i++)
{
long int offset = ( (i-1) * sizeof(students) );
system("cls");
cout <<"ttPresent : p ntt Absent : a"<<endl;
cout <<"nRoll #"<<i<<" : ";
cin >> ch1;
if (ch1 != 'p')
ch1 = 'a';
datafile.seekp(offset);
datafile <<ch1;
datafile.seekg(0);
}
我只想在第一行或第五行添加(追加)字符"p"或"a",我尝试了所有可能的方法,但都做不到。
您正在做的事情相当常见,但正如您所说,如果数据大小增加,则效率低下。两种解决方案是具有固定大小的记录和索引文件。
对于固定大小的记录,在文件中写入数据结构的确切字节,而不是可变长度的文本。这意味着您不再有文本文件,而是一个二进制文件。然后,您可以轻松地计算要查找的位置。
要创建索引文件,请同时写入两个文件,一个是可变大小的记录文件,另一个是写入一个二进制值,该值与文件开头的数据偏移量相同。由于索引是固定大小的,您可以查找索引,读取它,然后查找数据文件中的位置。如果新记录适合,您可以将其更新到位,否则用空格填充并将更新后的记录放在数据文件的末尾,然后更新索引文件以指向新位置。这基本上就是早期PC数据库的工作方式。
固定大小的记录相当不灵活,当您实现索引文件系统并对其进行测试时,现在您可能会使用进程中数据库。
我提出了自己的(简单而低效的)逻辑,将每一行(除了我想要更新的行)复制到另一个文件。我把我的文本文件创建成这样:
=p // p for present - 1st line
1 // roll number
Monte Cristo // full name
Black Michael // Fathers name
=a // a for absent - 5th line
2 // roll number
Johnson // full name
Nikolas // Fathers name
然后我制作了以下代码来更新第1行和第5行:
ifstream datafile("data.txt", ios ::in);
ofstream tempfile("temp.txt" , ios ::out);
string data, ch1;
while (getline(datafile,data))
{
if (data[0]=='=')
{
system("cls");
cout <<"ttPresent : pnttAbsent : a"<<endl;
cout <<"nRoll #"<<i<<" : ";
cin >> ch1;
++i;
if (ch1 != "p")
ch1 = "a";
data=data+ch1; // Appending (updating) lines.
}
tempfile <<data <<endl; // If it was 1st or 5th line, it got updated
}
datafile.close(); tempfile.close();
remove("data.txt"); rename("temp.txt" , "data.txt");
但正如你所看到的,这种逻辑是低效的。我仍将等待有人通知我是否可以以某种方式将文件指针移动到确切的位置(第1行和第5行)并更新它们。干杯
相关文章:
- 将两个数组中的差异记录在第三个数组中
- 禁止在控制台上记录谷神星
- 创建 Spdlog 异步文件记录器时遇到困难
- fastrtps:如何在发布/订阅级别使用 DDS 历史记录?
- 如何将自定义记录器与websocketpp一起使用?
- C++结构到德尔福记录dll调用
- 如何判断SSL_read是否已经接收并处理了来自单个消息的所有记录
- 如何实现具有多个平台__FILE__和__LINE__信息的 C/C++ 可变参数日志记录宏?
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 使用 Doxygen 记录枚举类值,而不启用EXTRACT_ALL
- 在C++中隐藏键盘记录器的控制台窗口
- 堆栈上的最大激活记录数
- 记录Doxygen中的命名
- 为什么Qt Creator的应用程序输出不能从spdlog记录器打印
- 在SQLITE数据库中写入记录需要花费大量时间.如何提高刀片操作效率?
- Qt 错误:QSqlQuery::value:尝试从表中检索统计信息时未定位在有效记录上 (QComboBox)
- 麻烦得到提升::记录器编译
- C++ 中混合二进制/文本日志记录的最佳做法
- 修改链表中的记录C++
- 使用流在C++中记录信息