2009-11-03 167 views
1

我想讀取文本文件並將其內容輸入到數組中。然後我想在命令行中顯示數組的內容。將文件讀入數組

我的想法是打開使用文件:

inFile.open("pigData.txt") 

然後獲得使用該文件的內容:

inFile >> myarray [size] 

然後顯示使用for循環的內容。

我的問題是,我試圖讀取的文件包含單詞,我不知道如何獲取整個單詞作爲數組中的元素。此外,讓我們說的話都用空格分開,即:

你好再見

可以在該文件中找到。我想將整行「hello goodbye」讀入並行數組的元素中。我怎樣才能做到這一點?

+1

聽起來像功課,對吧? – mjv 2009-11-03 02:20:46

+0

這不是作業我只是想自己學習C++。 我想出瞭如何將完整的單詞放入數組中,但我不知道如何將它放入並行數組中。我想將「你好再見」放在數組的元素0中。然而,它將「hello」存儲爲元素0,將「goodbye」存儲爲元素1. 感謝您的幫助。 – 2009-11-03 02:24:42

+0

「平行陣列」是什麼意思? – mch 2009-11-03 02:25:52

回答

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. 在時間讀取一個字,並假設 EAC h線上有​​兩個字。操作員將自動地一次讀取一個單詞。 (如果每一行都沒有兩個字,那麼你會遇到問題,試試看看事情是怎麼出現的。真的。獲得經驗的一個錯誤,當你知道什麼原因會幫助你在未來,當你知道原因是什麼。)

    while (input && numWords < MaxWords) { 
        input >> piglatin[numWords]; 
        input >> english[numWords]; 
        ++numWords; 
    } 
    

現在,如果你真的一個一個數組與兩個元素,那麼你需要定義另一個數據結構,因爲一個數組在每個元素中只能有一個「事物」。定義的東西,可以一次容納兩個字符串:

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對象,然後它使用.運算符轉到piglatinenglish必填。

+0

非常感謝您的解釋。我很抱歉沒有發佈到最後一個問題的鏈接。你現在已經真正的更清楚了,我想我會嘗試2號選項,因爲每行只有2個單詞。 – 2009-11-03 03:51:35

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"; 

編輯

你關於有「你好再見」作爲零元素和元素的一個評論是略顯混亂給我。上面的代碼片段將讀取文件的每一行,並將其作爲數組'file_contents'中的單個條目存儲。如果你想閱讀它,並將其拆分爲略有不同的空格。

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; 
} 
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; 
}