将文件读入数组

时间:2009-11-03 02:16:44

标签: c++ arrays string file

我想读取一个文本文件并将其内容输入到数组中。然后我想在命令行中显示数组的内容。

我的想法是使用以下方式打开文件:

inFile.open("pigData.txt")

然后使用以下方法获取文件的内容:

inFile >> myarray [size]

然后使用for循环显示内容。

我的问题是我试图读取的文件包含单词,我不知道如何将整个单词作为数组中的元素。另外,让我们说单词用空格分隔,因此:

  

你好再见

可以在文件中找到。我想把整行“hello goodbye”读成并行数组的元素。我怎么能这样做?

4 个答案:

答案 0 :(得分:4)

应该非常简单。

std::vector<std::string> file_contents;
std::string line;
while ( std::getline(inFile,line) )
    file_contents.push_back(line);

std::vector<std::string>::iterator it = file_contents.begin();
for(; it!=file_contents.end() ; ++it)
    std::cout << *it << "\n";

修改

你对“hello goodbye”作为元素零和元素一的评论对我来说有点混乱。上面的代码片段将读取文件的每一行,并将其作为单个条目存储在数组'file_contents'中。如果你想阅读它并将它分成稍微不同的空格。

答案 1 :(得分:3)

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    // This will store each word (separated by a space)    
    vector<string> words;
    // Temporary variable
    string buff;

    // Reads the data
    fstream inFile("words.txt");
    while(!inFile.eof())
    {
        inFile>>buff;
        words.push_back(buff);
    }
    inFile.close();

    // Display
    for(size_t i=0;i<words.size();++i) cout<<words[i]<<" ";
    return 0;
}

答案 2 :(得分:3)

对于上下文,您可以提供指向your previous question的链接,关于存储两个不同语言的单词列表。在那里,我提供了一个将文本文件的内容读入数组的示例:

const int MaxWords = 100;
std::string piglatin[MaxWords];
int numWords = 0;
std::ifstream input("piglatin.txt");
std::string line;
while (std::getline(input, line) && numWords < MaxWords) {
  piglatin[numWords] = line;
  ++numWords;
}
if (numWords == MaxWords) {
  std::cerr << "Too many words" << std::endl;
}

您不能拥有 一个 并行数组。对于要平行的东西,必须至少有两个。对于并行的单词数组,您可以使用如下声明:

std::string piglatin[MaxWords];
std::string english[MaxWords];

然后,您有两个选项可以从文件中填充数组:

  1. 读取整行,然后根据第一个空格的位置将该行分为两个单词:

    while (std::getline(input, line) && numWords < MaxWords) {
      std::string::size_type space = line.find(' ');
      if (space == std::string::npos)
        std::cerr << "Only one word" << std::endl;
      piglatin[numWords] = line.substr(0, space);
      english[numWords] = line.substr(space + 1);
      ++numWords;
    }
    
  2. 一次读一个单词,假设每行都有两个单词。 >>运算符会自动一次读取一个单词。 (如果每一行都没有正好两个单词,那么你就会遇到问题。试试看出来是怎么回事。真的。当你知道原因是什么的时候获得一个bug的经验当你知道原因是什么时,将来会帮助你。)

    while (input && numWords < MaxWords) {
      input >> piglatin[numWords];
      input >> english[numWords];
      ++numWords;
    }
    
  3. 现在,如果你真的有一个带有两个元素一个数组,那么你需要定义另一个数据结构,因为一个数组在每个元素中只能有一个“东西” 。定义一次可以容纳两个字符串的东西:

    struct word_pair {
      std::string piglatin;
      std::string english;
    };
    

    然后你将只有一个数组:

    word_pair words[MaxWords];
    

    你可以这样填写:

    while (std::getline(input, line) && numWords < MaxWords) {
      std::string::size_type space = line.find(' ');
      if (space == std::string::npos)
        std::cerr << "Only one word" << std::endl;
      words[numWords].piglatin = line.substr(0, space);
      words[numWords].english = line.substr(space + 1);
      ++numWords;
    }
    

    注意代码如何索引到words数组中以查找下一个word_pair对象,然后使用.运算符转到piglatin或{{必要时1}}字段。

答案 3 :(得分:1)

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

int main ()
{
    vector<string> fileLines;
    string line;
    ifstream inFile("pigData.txt");
    if ( inFile.is_open() ) {
        while ( !inFile.eof() ) {
            getline(inFile, line);
            fileLines.push_back(line);
        }
        inFile.close();
    } else {
        cerr << "Error opening file" << endl;
        exit(1);
    }

    for (int i=0; i<fileLines.size(); ++i) {
        cout << fileLines[i] << "\n";
    }
    cout << endl;

    return 0;
}