c++ - 更新文件中的记录 (c++)

标签 c++ visual-studio-2012

我想问一下如何将字符串附加到固定行数(固定位置)的末尾。我正在尝试并在书籍和网站上搜索我的答案,但我找不到我做错了什么。

我的结构:

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 <<"\t\tPresent : p \n\t\t Absent : a"<<endl;
        cout <<"\nRoll #"<<i<<" : ";
        cin >> ch1;
        if (ch1 != 'p')
            ch1 = 'a';
        datafile.seekp(offset);
        datafile <<ch1;
        datafile.seekg(0);
}

我只想在第一行或第五行添加(附加)字符'p'或'a',我尝试了所有可能的方法,但我无法做到。

最佳答案

您正在做的事情很常见,但是正如您所说,如果数据量增加,效率会很低。两种解决方案是具有固定大小的记录和索引文件。

对于固定大小的记录,在文件中写入数据结构的确切字节而不是可变长度的文本。这意味着您不再有文本文件,而是二进制文件。然后,您可以轻松计算出要寻找的位置。

要创建一个索引文件,一次写入两个文件,一个是可变大小的记录文件,另一个写入一个二进制值,其中包含数据相对于文件开头的偏移量。由于索引是固定大小的,您可以查找索引,读取它,然后查找数据文件中的位置。如果新记录适合,您可以就地更新它,否则填充空白并将更新的记录放在数据文件的末尾,然后更新索引文件以指向新位置。这基本上就是早期 PC 数据库的工作方式。

固定大小的记录相当不灵活,当您实现索引文件系统并对其进行测试时,现在您可能会改用进程内数据库。

关于c++ - 更新文件中的记录 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29317533/

相关文章:

c++ - 在 C++20 中是否不再允许在 std 中为程序定义类型专门化函数模板?

visual-studio-2012 - Visual Studio 2012 终止了我的 WCF 服务引用

.net-4.0 - 如何使用带有 C++/CLI 的 app.config 文件在 VS 2012 中配置程序集绑定(bind)?

c# - 访问 C# WPF 应用程序中的资源(同一程序集)

c++ - C++ 是否支持字符串类型的常量数组?

c++ - 用 vector 分而治之的最近点对

c++ - 在此函数的返回值中使用迭代器的目的是什么?

python - Cython:通过引用传递

entity-framework - Visual Studio 2012 - 无法移动 EF .tt 文件

visual-studio - 如何在 Visual Studio 2012 中重命名解决方案、解决方案文件夹、项目文件夹、包/过滤器文件夹和 vcxproj 文件