41523


注：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に直しても変わらなかったため、質問させていただきました。

[code]

    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;
    }
    
[/code]


CC BY-SA 3.0
2018-02-06T14:14:59.017
41521
2018-02-06T15:10:19.987
2018-02-06T15:10:19.987
19110
27307
question
c++ gcc wsl
ostringstreamで扱ったtxtファイルの文字化け


>
[code]

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

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

[code]

    string Company::set_written_element(){
      string buffer;
      string tmp;
    ~~
      return tmp;
    }
    
[/code]


CC BY-SA 3.0
2018-02-06T14:31:10.560
41523
2018-02-06T14:31:10.560
4236
41521
answer