0

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

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>

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

4

3 回答 3

0

至少有两种选择:

  • 您可以检查写入的行是否是最后一行并在写入之前修剪字符串。

  • 完成写入后,您可以从文件中删除最后一个字符。

于 2013-04-10T10:04:58.663 回答
0

eof()从文件中提取时不要用作您的条件。它并不能很好地表明是否实际上还有任何东西可以提取。将其更改为:

while (getline(inputempfile,line))
{
  if((linecount<employee_line || linecount>employee_line+3))
  {
    outputempfile<< line;
  }
  linecount++;
}

\n文本文件通常以文本文件隐藏的额外内容结尾。正如您所拥有的那样,当您迭代时,将读取最后一行并\n提取最后一行。由于getline不关心读取超出\n(毕竟是分隔符),它没有看到它已经到达末尾,所以没有设置 EOF 位。这意味着即使没有任何内容可读取,下一次迭代也会继续,getline提取文件末尾的虚无,然后将其写入输出。这给了你这条额外的线。

于 2013-04-10T10:08:36.017 回答
0

或者,如果行变量仅包含“\n”,则不要将“行”变量写入“outputempfile”

即是这样的:

while (getline(inputempfile,line))
{
  if((linecount<employee_line || linecount>employee_line+3) && strcmp(line,"\n")==0)
  {
    outputempfile<< line;
  }
  linecount++;
}

不确定语法,但这个想法应该可行

于 2013-04-10T10:58:52.130 回答