【问题标题】:How to prevent "\n" being written at the end of file如何防止在文件末尾写入“\n”
【发布时间】:2013-04-02 02:38:00
【问题描述】:

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

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>

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

【问题讨论】:

  • 您如何检查新行?文本文件通常在文件末尾有一个额外的\n。但是,它通常被您的文本编辑器隐藏。新行是否显示在文本编辑器中?

标签: c++ string file getline


【解决方案1】:

至少有两种选择:

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

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

【讨论】:

  • 是的,换行符显示在我的文本编辑器上,我使用的是 sublime 文本。原始文本文件没有空白新行。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢提醒。我已经改了,还是有新的空白换行符。
  • @soulchild 嗯...你如何确定有一个空行?在文本编辑器中?其实,我不明白。你不应该得到任何换行符。你没有做&lt;&lt; endl。你确定这是你的真实代码吗?
  • 我的文本编辑器在左侧显示行数。删除位于底部的员工后,显示了 4 行数据,但我的文本编辑器显示行数为“5”。是的,这是我的真实代码。
  • @soulchild 那么我很困惑。为什么你会得到任何换行符?
  • getline 从输入文件中读取文本,直到并包括换行符。输入文件的第四行以换行符结尾,您可以阅读并打印。
【解决方案3】:

或者,如果行变量仅包含“\n”,则不要将“行”变量写入“输出临时文件”

就是这样的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2014-10-26
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2011-04-14
    相关资源
    最近更新 更多