我想问一下如何将字符串附加到固定行数(固定位置)的末尾。我正在尝试搜索书籍和网站以寻找答案,但我无法找到我做错的事。
我的结构:
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);
}
我只想添加(追加)字符&#39; p&#39;或者&#39; a&#39;到了第一行或第五行,我尽可能地尝试了,但我无法做到。
答案 0 :(得分:0)
我提出了自己的(简单和低效)逻辑,将每一行(我要更新的行除外)复制到另一个文件。 我将我的文本文件创建为:
=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 <<"\t\tPresent : p\n\t\tAbsent : 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行)并更新它们,我仍然会等待让某人通知我。 干杯!
答案 1 :(得分:0)
您正在做的事情相当普遍,但正如您所说,如果数据量增长,则效率低下。两种解决方案是拥有固定大小的记录和索引文件。
对于固定大小的记录,在文件中写入数据结构的确切字节而不是可变长度文本。这意味着您不再拥有文本文件,而是二进制文件。然后,您可以轻松计算要寻找的位置。
要创建索引文件,请一次写入两个文件,一个写入可变大小的记录文件,另一个写入二进制值,其中包含文件开头的数据偏移量。由于索引是固定大小,您可以查找索引,读取它,然后搜索到数据文件中的位置。如果新记录适合,您可以在适当的位置更新它,否则用空格填写并将更新的记录放在数据文件的末尾,然后更新索引文件以指向新位置。这基本上是早期PC数据库的工作方式。
固定大小的记录相当不灵活,当你实现索引文件系统并对其进行测试时,现在你可能会使用进程内数据库。