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

您可以将字符串视为一个字符数组,因此您只需要一个字符串数组:

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] << " ";
    }
  }
}
于 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 回答