ostringstreamで扱ったtxtファイルの文字化け

投稿者: Anonymous

注:CompanyはFileクラスから継承。set_written_elementでwriteに文字列を渡し、表示させる。
macでは問題ないが、windows10のwslではtxtファイルが文字化けを起こします。
いったい何が悪いのでしょうか?

gccのバージョンはgcc (Ubuntu 5.4.0-6ubuntu1~16.04.6) 5.4.0 20160609でした。
txtファイルをvimで見ると illegal byte in line となっており、文字コードをもとのutf-8からshift-jis, euc-jpに直しても変わらなかったため、質問させていただきました。

int main(){
  Company company_test;
  char path[]="company_test.txt";
  company_test.input_path(path);
  company_test.show();
  company_test.write(company_test.set_written_element());
  cout << company_test.set_written_element() << endl; //winだとset_written_elementがおかしい
  company_test.show();
  return 0;
}

void File::write(const char* text){
  int line_number;
  line_number=Line_Count(output_path());
  ofstream fd(output_path(),ios::app);
  fd << line_number << " " << text << "n";
  fd.close();
}

const char* Company::set_written_element(){
  const char* written_element;
  string buffer;
  string tmp;
  ostringstream ret_char;
  int i;
  for(i=0; i<=2;i++){
    switch(i){
      case 0:
        cout << "勤務先を入力してください。" << endl;
        cin >> buffer;
        ret_char << setw(25) << left << buffer;
        buffer.clear();
        break;

      case 1:
        cout << "時給を入力してください。" << endl;
        cin >> buffer;
        ret_char << setw(10) << left << buffer;
        buffer.clear();
        break;

      case 2:
        cout << "備考を入力してください。" << endl;
        cin >> buffer;
        ret_char << setw(50) << left << buffer;
        buffer.clear();
        break;
    }
  }
  tmp = ret_char.str();
  written_element = tmp.c_str();
  return written_element;
}

解決

const char* Company::set_written_element(){
  const char* written_element;
  string buffer;
  string tmp;
~~
  written_element = tmp.c_str();
  return written_element;
}

少なくともreturnする直前にstring tmpのデストラクターが実行されtmpの指していた文字列のメモリは解放されます。そのため、Company::set_written_element()が返す文字列は不正なアドレスを指していることになります。素直にstringを返すべきです。

string Company::set_written_element(){
  string buffer;
  string tmp;
~~
  return tmp;
}
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *