1

テキストファイルを作成しましたlove.txt

i love you
you love me

それらを別々の配列に格納し、コンソールに表示するにはどうすればよいline1ですline2か?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
  string line1[30];
  string line2[30];
  ifstream myfile("love.txt");
  int a = 0;
  int b = 0;
  if(!myfile) 
  {
    cout<<"Error opening output file"<<endl;
    system("pause");
    return -1;
  }
  while(!myfile.eof())
  {
    getline(myfile,line1[a],' ');
    cout<<"1."<<line1[a]<<"\n";
    getline(myfile,line2[b],' ');
    cout<<"2."<<line2[b]<<"\n";
  }
}
4

4 に答える 4

6

両方の関数で最後の引数を「\n」として指定してみてください。getline()

getline(myfile, line1[a], '\n');

それ以外の

getline(myfile, line1[a], ' ');
于 2012-07-18T16:53:46.580 に答える
4

これはどう.. 。

vector <string> v;
string line;    
ifstream fin("love.txt");
while(getline(fin,line)){
    v.push_back(line);
}
于 2015-02-16T02:53:17.860 に答える
2

文字列は文字の配列と考えることができるため、必要な文字列の配列は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は、使用してもよいかどうかを示すブール値に変換されますtruefalse) 。


更新

私はあなたが何を求めているのかを理解しました。入力を一連の単語(スペースで区切る)として読みたいが、それらを行として表示したいのです。この場合、各行を格納するために配列の配列が必要になります

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] << " ";
    }
  }
}
于 2012-07-18T16:49:54.183 に答える
1

私の完全な解決策。

config.txtファイルには次のものが含まれています。

#URL WEB POP3 IMAP SMTP FTP DNS PING ORDER
st-xxxx.com 1 1 0 1 1 0 1 1
24.xxx.195.11 1 1 0 1 1 0 1 2
24.xxx.195.12 1 1 0 1 1 0 1 3
192.168.0.100 1 1 0 1 1 0 1 4

と私のコード:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

int main()
{

  ifstream myfile("config.txt");
  if(!myfile)
  {
    cout<<"Error opening output file"<<endl;
    system("pause");
    return -1;
  }

    const size_t SIZE1 = 30;
    const size_t SIZE2 = 10;
    string line[SIZE1][SIZE2];

    string tmp; // temporary string to store the line-as-string

    size_t i=0; // the current line index
    size_t j=0; // the current word index


    while(!myfile.eof() && i < SIZE1) {
    getline(myfile, tmp);
    stringstream ss(tmp); // convert the line to an input stream to be able 
//to extract the words
    size_t j=0;
    while (ss) {
      ss >> line[i][j]; // here i is as above: the current line index
      ++j;
    }
    i++;
    }

    size_t numLines = i;

    cout << numLines << "\n";
for (i=1; i <= numLines; ++i) {

  for (size_t j=0; j < SIZE2; ++j) {
    if (!line[i][j].empty()) {
      cout << line[i][j] << " ";
    }
  }
  cout << "\n";
}
    cout << line[3][0] << "\n"; // print the third line first word
}

投稿がかなり古い場合でも、このタイプの解決策を探している人に役立つことを願っています。

于 2022-02-18T00:56:26.630 に答える