0

従業員情報を含むテキスト ファイルを読み書きするプログラムを作成しています。各従業員情報は、以下のようなテキストファイル内に保存されます。従業員情報は 4 行に格納されます。

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

少なくとも 2 つのオプションがあります。

  • 書き込んだ行が最終行かどうかを確認し、文字列をトリミングしてから書き出すことができます。

  • 書き込みが完了したら、ファイルから最後の文字を削除できます。

于 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 に答える