格式化字符串

时间:2012-11-09 20:06:45

标签: c++

您应该使用C ++字符串对象或C-String来解决此问题。从文件中读取内容。 文件格式是这样的:在每行中:1)有三列,2)每列都是分隔的 通过|。 将每一行输出到stdout。第一列宽度应为15,第二列宽度应为 8,第三列宽度应为6.如果行以#开头,则应跳过它。此外, 第二列应显示为2位小数。 可能超过3行;你不能只假设3行。但是,你可以假设 只有3列。 样本输入

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

所以,鉴于程序大纲(我不是要你写我的代码!:()这里是我对如何做的想法...... 多维数组,但是可以有三个以上的行,所以使用该变量我不认为我可以做多维数组。

我还考虑过读取每一行,将其分开,格式化然后将其打印出来,一次只担心每一行。我认为这是最好的方式,但我愿意通过建议做任何事情。我想我会通过使用某种行尾“分隔符”来实现它。

我能找到的唯一另一个问题是,如果前导字符是#,我应该忽略并跳过行。我不知道怎么做,我认为ignore()函数是一种方式,但据我所知,它开始跳过事物,直到达到你的限制或找到分隔符。我不认为有一种方法,使用该函数,首先找到delim字符,然后跳过EOL之后的所有内容。

3 个答案:

答案 0 :(得分: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
}

这是一种重载&gt;&gt;的方法运营商从快速谷歌搜索中获取:

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的建议把每一行抓到一个结构中。这应该是您实施解决方案所需的一切。

答案 1 :(得分: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 

}

答案 2 :(得分:0)

鉴于每行包含正好三个项目,并且您可能想要跳过某些行,我会:

  1. 创建一个包含三个字符串(或其他)的结构来保存一行数据。
  2. 创建std::vector<your_struct>以保存您阅读的数据。
  3. 使用std::getline将整行录入字符串。
  4. 检查该行是否以#开头(如果是,请跳过循环的其余部分)。
  5. 将三个项目解析出来,并将其保存到struct个中。
  6. struct推送到std::vector