0

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

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

因此,鉴于该程序大纲(我不是要求您编写我的代码!:()这是我对要做什么的想法...多维数组,但可以有超过三行,所以我不使用那个变量不认为我可以因此做一个多维数组。

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

我能找到的唯一另一个问题是,如果前导字符是#,我应该忽略并跳过行。我也不知道该怎么做,我认为 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
}

这是一种重载从快速谷歌搜索中获取的 >> 运算符的方法:

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

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

  1. 创建一个由三个字符串(或其他)组成的结构来保存一行数据。
  2. 创建一个std::vector<your_struct>来保存您读取的数据。
  3. 使用 . 将整行读入字符串std::getline
  4. 检查该行是否以开头#(如果是,则跳过循环的其余部分)。
  5. 将这三个项目解析出来并将它们保存到您struct的其中一个中。
  6. 将其推structstd::vector.
于 2012-11-09T20:15:31.597 回答