文字列は文字の配列と考えることができるため、必要な文字列の配列は1つだけです。
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<>
ます(したがって、保存した数を追跡する必要はありません)。
注:のような定数を使用SIZE
すると、1か所でのみサイズを変更できます
注eof()
:ファイルの終わりに到達する以外の読み取りエラーが発生した場合に備えて、:の上に入力ストリームのエラーのチェックを追加する必要があります。
while (myfile && ...) {
// ...
}
ここでmyfile
は、使用してもよいかどうかを示すブール値に変換されますtrue
(false
) 。
更新:
私はあなたが何を求めているのかを理解しました。入力を一連の単語(スペースで区切る)として読みたいが、それらを行として表示したいのです。この場合、各行を格納するために配列の配列が必要になります
string line[SIZE1][SIZE2];
ここSIZE1
で、は保存できる最大行数であり、SIZE2
は1行に保存できる単語の最大数です。
このマトリックスの入力はより複雑になります。入力を1行ずつ読み取り、その行内の単語を区切る必要があります。
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] << " ";
}
}
}