如何预防" \ n"写在文件的末尾

时间:2013-04-10 10:00:59

标签: c++ string file getline

我正在编写一个程序来读取/写入包含员工信息的文本文件。 每个员工信息都存储在如下文本文件中。 员工信息存储为四行。

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>

如何防止将换行写入文件?

3 个答案:

答案 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++;
}

不确定语法但这个想法应该有效