c++ CSVを読み込む際、余計な文字が入ってしまう現象について

現象

以下のようなコードでCSVで読み込んだ際に余計な文字列が入る現象が発生しました。

 
#include <iostream>
#include <string>
#include <sstream>
#include <vector>

std::ifstream ifs;
ifs.open(CSVpath.c_str());
std::string value;
std::vector<std::string > values;

bool isOpen = ifs.is_open();//正常なデータを開けたか

if (isOpen)
{
  //一行読み込みテスト
  //   std::getline(ifs, value);

    //全データを読み込む
    while (std::getline(ifs, value, ','))
    {
        if(value != "/n") values.push_back(value);
    }
}

こんな感じになる。 f:id:Brave345:20200110124206p:plain

CのFILEでのCSV読み込みもこうなります。

原因

文字コードが問題でした

csvUTF-8で保存してたらBOM(先頭の数バイトにどの種類の符号化形式)があるためそれも一緒に読み込んでしまうため、CSVで読み込んだ際に余計な文字列が入ってしまいます。

参考URL

uxmilk.jp

対策

csvを直接修正

メモ帳でcsvをひらいてそのまま上書き保存、または名前を付けて保存で文字コードASCIIにして保存すればOKです。

参考URL

global-wing.com

・コードでcsvを読み込む場合の修正

csvを詠み込んだ際、最初の数bitをみて文字コードが問題ないかを調べるとか。

・コードでcsvを書き出す際の修正

C#ならStreamWriterの引数をEncoding.ASCIIにすればいいです。

using System.IO;

        /// <summary>
        /// CSVにデータを書き込む
        /// </summary>
        /// <param name="List"></param>
        public void Save()
        {
                StreamWriter file = new StreamWriter(s, false, Encoding.ASCII);
          
                file.Write("0"+ "," + "1" + "," + "\n");
             
                file.Close();
          }

c++は調べたけどわかりませんでした、、、、

おまけ

ちなみにC#のStreamReaderでCSVを読み込む際はUTF-8のBOMは無視されるぽいです。 c++もそうしてくれー