0

この問題には、C++ 文字列オブジェクトまたは C-String を使用する必要があります。ファイルからコンテンツを読み取ります。ファイル形式は、各行に 1) 3 つの列があり、2) 各列は | で区切られています。各行を stdout に出力します。最初の列の幅は 15、2 番目の列の幅は 8、3 番目の列の幅は 6 にする必要があります。行が # で始まる場合はスキップする必要があります。また、2列目は小数点以下2桁まで表示する必要があります。3 行以上ある場合もあります。3 行だけを想定することはできません。ただし、列は 3 つしかないと想定できます。サンプル入力

#Test file one
C1|c2|c4
Xyz|1.2|100
Abc|5.5|200

したがって、そのプログラムの概要を考えると (私はあなたに私のコードを書くように求めているわけではありません! :( ) ここに何をすべきかについての私の考えがあります... 多次元配列ですが、3 つ以上の行がある可能性があるので、その変数では私はしませんそのため、多次元配列を実行できるとは思いません。

また、各行を読み取り、分割し、フォーマットしてから印刷することも考えましたが、一度に各行だけを心配しました。私はそれが可能な限り最善の方法であると考えていますが、提案によって何でもすることにオープンです。ある種の行末「区切り文字」を使用してそれを行うと思います。

私が見つけることができる他の唯一の問題は、先頭の文字が # であるかどうかに基づいて、行を無視してスキップすることになっていることです。それを行う方法もわかりません。ignore()関数は方法だと思いますが、私が理解しているように、制限に達するかデリミネーターが見つかるまでスキップを開始します。その関数を使用して、最初に delim 文字を見つけ、その後すべてを EOL にスキップする方法はないと思います。

4

3 に答える 3

2

役立つスニペット:

std::cout.precision(2)
std::cout << std::fixed << 1.5; // prints 1.50
std::cout << std::setw (10) << "hi!"; // prints "       hi!"

# 行をスキップするには:

std::string s;
ifstream input("test.txt");
while(input >> s){
    if(s[0] == '#') continue;
    // other processing
}

そして、簡単な Google 検索から取得した >> 演算子をオーバーロードする方法を次に示します。

struct Time
{
    int hours, minutes;
};
istream &operator >> (istream &is, Time &t)
{
    is >> t.hours;
    is.ignore(1,':');
    is >> t.minutes;
    return is;
}

これを使用すると、次のようになります。

Time t;
ifstream input("time.txt"); // A file containing one line: "6:30"
input >> t; //t now has hours = 6 and minutes = 30

Jerry Coffinが提案したように、各行を構造体に取り込むために使用できます。これで、ソリューションを実装するために必要なすべてが揃っているはずです。

于 2012-11-09T20:29:28.557 に答える
1

情報を配列に格納する必要はありません。情報を読み取り、出力することができます。たとえば、スケルトンは次のようになります。

string line;
ifstream inputStream("data.txt");

while( getline(inputStream, line) ){ //grab line if possible
 std::vector<std::string> tokens = parseLine( line, '|'); //parse line using '|' as delim
 //if !tokens.empty && tokens[0][0] != '#'
   //print tokens[i] accordingly 

}
于 2012-11-09T20:11:49.557 に答える
0

各行に正確に 3 つの項目が含まれており、いくつかの行をスキップしたい場合は、次のようにします。

  1. 1 行のデータを保持する 3 つの文字列 (またはその他) の構造体を作成します。
  2. std::vector<your_struct>読み取ったデータを保持する を作成します。
  3. を使用して行全体を文字列に読み込みますstd::getline
  4. 行がで始まるかどうかを確認します#(そうであれば、ループの残りをスキップします)。
  5. 行から 3 つの項目を解析し、いずれかの に保存しますstruct
  6. structそれを に押し込みstd::vectorます。
于 2012-11-09T20:15:31.597 に答える