0

こんにちは、異なる double 値に基づく命名規則を使用して、関数からさまざまな csv ファイルを保存したいと考えています。これを for ループで行い、文字列値を渡して各 .csv ファイルを別々に保存します。以下は、私がやろうとしていることの例です。

1.1_file.csv
1.2_file.csv

しかし、代わりに私は得る

1.1_file.csv
1.11.2_file.csv

これは実際のサンプルコードです。これを修正するにはどうすればよいですか

#include <sstream>
#include <iomanip>
#include <cmath>
#include <iostream>
#include <vector>

int main(){
    std::string file = "_file.csv";
    std::string s;
    std::ostringstream os;
    double x;

    for(int i = 0; i < 10; i++){
        x = 0.1 + 0.1 *i;
        os << std::fixed << std::setprecision(1);
        os << x;
        s = os.str();
        std::cout<<s+file<<std::endl;
        s.clear();
    }

    return 0;
}
4

2 に答える 2

1

ostringstreamは、ループの反復ごとに追加されます。以下に示すように、クリアして再利用する必要があります(提供:ostringstreamを再利用する方法?再利用する方法についてostringstream

#include <sstream>
#include <iomanip>
#include <cmath>
#include <iostream>
#include <vector>

int main() {

    std::string file = "_file.csv";
    std::string s;

    double x;
    std::ostringstream os;

    for (int i = 0; i < 10; i++) {

        x = 0.1 + 0.1 * i;
        os << std::fixed << std::setprecision(1);
        os << x;
        s = os.str();
        std::cout << s + file << std::endl;
        os.clear();
        os.str("");
    }

    return 0;
}
于 2012-09-24T02:59:29.210 に答える
1

はループのostringstream反復ごとにリセットされないため、x反復ごとに追加するだけです。のスコープ内に配置して、反復ごとに異なるクリーン オブジェクトにするか、 でコンテンツをリセットしforます。osos.str("")

また、変数sは不要です。あなたはただすることができます

std::cout << os.str() + file << std::endl;

また、必要がなくs、文字列のコピーを作成するオーバーヘッドがなくなります。

于 2012-09-24T02:57:54.150 に答える