我正在编写一个程序来读取/写入包含员工信息的文本文件。 每个员工信息都存储在如下文本文件中。 员工信息存储为四行。
W00051 M
Christopher Tan
1200.00 150.00 1400.20 156.00 200.00 880.00 1500.00 8000.00 800.00 120.00 1600.00 1800.00
1280.00 1500.00 140.80 1523.00 2000.00 2300.00 2600.00 8800.00 19800.00 1221.00 3000.00 1900.00
W00012 E
Janet Lee
2570.00 2700.00 3000.00 3400.00 4000.00 13000.00 200.00 450.00 1200.00 8000.00 4500.00 9000.00
1238.00 560.00 6700.00 1200.00 450.00 789.00 67.90 999.00 3456.00 234.00 900.00 2380.00
我有一个删除员工功能,接受员工ID(W00012)并删除包含员工信息的行。更新后的文件存储在tempfilesource中。
void delete_employee(char filesource[],char tempfilesource[],int employee_line,char inputid[])
{
char charline[255];
string line;
int linecount = 1;
ifstream inputempfile;
ofstream outputempfile;
inputempfile.open(filesource);
outputempfile.open(tempfilesource);
outputempfile.precision(2);
outputempfile.setf(ios::fixed);
outputempfile.setf(ios::showpoint);
if (inputempfile.is_open())
{
while (getline(inputempfile,line))
{
if((linecount<employee_line || linecount>employee_line+3))
{
outputempfile<< line;
}
linecount++;
}
inputempfile.close();
outputempfile.close();
}
}
当我要删除的员工位于文本文件的底部时,会出现问题。 更新的文件包含一个空白换行符:
W00051 M
Christopher Tan
1200.00 150.00 1400.20 156.00 200.00 880.00 1500.00 8000.00 800.00 120.00 1600.00 1800.00
1280.00 1500.00 140.80 1523.00 2000.00 2300.00 2600.00 8800.00 19800.00 1221.00 3000.00 1900.00
<blank newline>
如何防止将换行写入文件?
答案 0 :(得分:0)
至少有两个选择:
您可以检查书写行是否为最后一行,并在编写之前修剪字符串。
完成写作后,您可以删除文件中的最后一个字符。
答案 1 :(得分:0)
从文件中提取时,请勿使用eof()
作为条件。它没有很好地说明是否实际上还有任何东西需要提取。将其更改为:
while (getline(inputempfile,line))
{
if((linecount<employee_line || linecount>employee_line+3))
{
outputempfile<< line;
}
linecount++;
}
文本文件通常以文本文件隐藏的额外\n
结尾。正如您所经历的那样,当您进行迭代时,将读取最后一行并且将提取最终的\n
。由于getline
并不关心超出\n
(毕竟是分隔符),因此它没有看到它已到达结尾,因此未设置EOF位。这意味着即使没有任何内容可供阅读,下一次迭代也会继续,getline
会在文件末尾提取虚无,然后将其写入输出。这给了你额外的这条线。
答案 2 :(得分:0)
或者如果行变量仅包含“\ n”,则不要将“line”变量写入“outputempfile”
就像这样:
while (getline(inputempfile,line))
{
if((linecount<employee_line || linecount>employee_line+3) && strcmp(line,"\n")==0)
{
outputempfile<< line;
}
linecount++;
}
不确定语法但这个想法应该有效