您应该使用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之后的所有内容。
答案 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)
鉴于每行包含正好三个项目,并且您可能想要跳过某些行,我会:
std::vector<your_struct>
以保存您阅读的数据。std::getline
将整行录入字符串。#
开头(如果是,请跳过循环的其余部分)。struct
个中。struct
推送到std::vector
。