您可以将字符串视为一个字符数组,因此您只需要一个字符串数组:
const size_t SIZE = 30;
string line[SIZE]; // creates SIZE empty strings
size_t i=0;
while(!myfile.eof() && i < SIZE) {
getline(myfile,line[i]); // read the next line into the next string
++i;
}
for (i=0; i < SIZE; ++i) {
if (!line[i].empty()) { // print only if there is something in the current line
cout << i << ". " << line[i];
}
}
您也可以维护一个计数器来查看您存储了多少行(而不是检查空行)——这样您也可以正确打印空行:
const size_t SIZE = 30;
string line[SIZE]; // creates SIZE empty strings
size_t i=0;
while(!myfile.eof() && i < SIZE) {
getline(myfile,line[i]); // read the next line into the next string
++i;
}
size_t numLines = i;
for (i=0; i < numLines; ++i) {
cout << i << ". " << line[i]; // no need to test for empty lines any more
}
注意:您最多只能存储SIZE
行。如果你需要更多,你将不得不增加SIZE
代码。稍后您将了解std::vector<>
它允许您根据需要动态增加大小(因此您无需跟踪存储的数量)。
注意:使用常量 likeSIZE
只允许您在一处更改大小
注意:您应该在输入流的顶部添加一个错误检查eof()
:以防出现读取失败而不是到达文件末尾:
while (myfile && ...) {
// ...
}
这里myfile
被转换为一个布尔值,指示是否可以使用它 ( true
) 或不 ( false
)
更新:
我刚刚意识到您在追求什么:您想将输入读取为一系列单词(以空格分隔),但将它们显示为行。在这种情况下,您将需要 arrays-of-arrays 来存储每一行
string line[SIZE1][SIZE2];
whereSIZE1
是您可以存储的最大行数,并且SIZE2
是您每行可以存储的最大单词数
填充此矩阵将更加复杂:您需要逐行读取输入,然后将行内的单词分开:
string tmp; // temporary string to store the line-as-string
getline(myfile, tmp);
stringstream ss(tmp); // convert the line to an input stream to be able to extract
// the words
size_t j=0; // the current word index
while (ss) {
ss >> line[i][j]; // here i is as above: the current line index
++j;
}
输出:
for (i=0; i < numLines; ++i) {
cout << i << ". ";
for (size_t j=0; j < SIZE2; ++j) {
if (!line[i][j].empty()) {
cout << line[i][j] << " ";
}
}
}