2

そのため、後で処理できるように、先行0を強制しようとしています。intさて、私が SO または他の Web サイトで見たすべてのチュートリアルは、すべて次のようなものを使用しています。

cout << setfill('0') << setw(2) << x ;

これは素晴らしいですが、 で動作させることしかできないようですがcout、テキストを出力したくありません。後で使用するために数字をパディングしたいだけです。

これまでのところ、これは私のコードです..

#include <iostream>
#include <string>
#include <iomanip> 
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#include <vector>
#include <sstream>

/*
using std::string;
using std::cout;
using std::setprecision;
using std::fixed;
using std::scientific;
using std::cin;
using std::vector;
*/
using namespace std;

void split(const string &str, vector<string> &splits, size_t length = 1)
{
    size_t pos = 0;
    splits.clear();    // assure vector is empty

    while(pos < str.length())    // while not at the end
    {
        splits.push_back(str.substr(pos, length));    // append the substring
        pos += length;                                // and goto next block
    }
}

int main()
{
    int int_hour;
    vector<string> vec_hour;
    vector<int> vec_temp;

    cout << "Enter Hour: ";
    cin >> int_hour;

    stringstream str_hour;
    str_hour << int_hour;

    cout << "Hour Digits:" << endl; 
    split(str_hour.str(), vec_hour, 1);
    for(int i = 0; i < vec_hour.size(); i++)
    {
        int_hour = atoi(vec_hour[i].c_str());
        printf( "%02i", int_hour);
        cout << "\n";
    }   

    return 0;
}

intを入力し、それを astringstreamにキャストして単一の文字に分割し、整数に戻すというアイデアです。ただし、10 未満 (<10) の場合は、左側に 0 を埋め込む必要があります。

みんなありがとう

編集: 上記のコードは、私のメイン コードの一部にすぎません。これは、動作させようとしている部分です。

多くの人が私の言いたいことを理解するのに苦労しています。だから、ここに私の考えがあります。さて、プロジェクトの全体的なアイデアは、ユーザー入力 (時間 (時間、分) 日 (数値、月番号) など) を取得することです。ここで、これらの数値を対応するベクトル (vec_minute、vec_hour など) に分解し、そのベクトルを使用してファイル名を指定する必要があります.. cout << vec_hour[0] << ".png"; cout << vec_hour[1] << ".png";

これで、 for ループを使用してベクトルの出力を処理できることがわかりました。入力を個々の文字に分解するのに助けが必要です。ユーザーにすべての数字を 2 桁で入力するように求めているため、数字が分割メソッドに渡される前に、プログラムが先行する 0 を自動的に削除するため、数字 10 (数字の前に 0 が付く) より下のものは数字に分割されません (つまり、. 10 を入力すると、出力は 10 になり、0\n9 を入力すると、出力は 1 桁の 9 になります)。私はこれを持つことができません。分割メソッドに渡される前に、10 未満の数字を 0 で埋める必要があるため、2 つの分割数字が返されます。私が見つけたデータ型を分割するための最良の方法であるため、整数を文字列ストリームにキャストします (ご参考までに)。

私がすべてをもっとよく説明してくれることを願っています:/

4

3 に答える 3

14

あなたの質問を正しく理解していれば、これらのマニピュレータを で使用できstringstreamます。たとえば、次のようになります。

std::stringstream str_hour;
str_hour << setfill('0') << setw(2) << int_hour;

文字列ストリームは出力ストリームであるため、I/O マニピュレータは の動作に影響を与えるのと同じ方法で影響を与えますstd::cout

完全な例:

#include <sstream>
#include <iostream>
#include <iomanip>

int main()
{
    std::stringstream ss;
    ss << std::setfill('0') << std::setw(2) << 10; // Prints 10
    ss << " - ";
    ss << std::setfill('0') << std::setw(2) << 5; // Prints 05

    std::cout << ss.str();
}

対応するlive example .

于 2013-06-18T17:57:46.250 に答える