2016-07-29 182 views
1

的文本文件看起來像這樣:創建陣列

3 
String 
String2 
String3 

我必須創建一個函數來讀取所有的文本文件中的字符串,將它們保存到數組,然後在主函數顯示它。例如

void reading(int & count, string strings[]) { 
ifstream fd "text.txt"; 
fd >> count; 
for (int i=0; i<count; i++) 
fd >> strings[i]; 
fd.close(); 

及主要功能:

int main() { 
int count=0; 
string strings[100]; 
reading(count, strings); 
for (int i=0; i<count; i++) 
cout << strings[i] << endl; 

串的數目寫在文本文件的第一行。我怎樣才能創建一個完全相同的數組?我需要它能夠在主要/其他功能中訪問它。 (例如寫入另一個文本文件的函數)。

+1

你會用'的std ::矢量',而不是一個數組? – StaticBeagle

+0

我想對你說實話......幫助別人真的很酷,但你應該永遠考慮到我們必須從某個地方開始。這意味着你必須開始,然後才能通過終點線 – tistCoder

回答

4

在情況下,存在這樣做與數組,然後使用std::new,這樣的超級重要的原因:

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

int reading(string** str_array, int& size, string filename) { 
    ifstream infile(filename.c_str()); 
    if(!infile) { 
     cerr << "Unable to access file!\n"; 
     return -1; 
    } 
    int n = 0; 
    infile >> size; 
    try{ 
     *str_array = new string[size]; 
     string str; 
     for (; n < size && infile; ++n) { 
      infile >> str; 
      (*str_array)[n] = str; 
     } 

     if (n != size) 
      cerr << "ERROR, read less than " << size << " strings!!\n\n"; 
    } catch(bad_alloc& exc) { 
     return -2; 
    } 
    return 0; 
} 


int main() { 
    string* str_array = NULL; 
    int size; 
    if(reading(&str_array, size, "test.txt")) { 
     cerr << "Din't read file, exiting...\n"; 
     return -1; 
    } 
    for(int i = 0; i < size; ++i) 
     cout << str_array[i] << endl; 

    delete [] str_array; // DO NOT FORGET TO FREE YOUR MEMORY 
    str_array = NULL; 

    return 0; 
} 

輸出:

C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
String 
String2 
String3 

然而,你在,你沒有使用這個std::vector

顯得多麼簡單,它是與:

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

int reading(vector<string>& v, string filename) { 
    ifstream infile(filename.c_str()); 
    if(!infile) { 
     cerr << "Unable to access file!\n"; 
     return -1; 
    } 
    int N = -1, n = 0; 
    infile >> N; 
    string str; 
    for (; n < N && infile; ++n) { 
     infile >> str; 
     v.push_back(str); 
    } 

    if (n != N) 
     cerr << "ERROR, read less than " << N << " strings!!\n\n"; 
    return 0; 
} 

int main() { 
    vector<string> v; 
    if(reading(v, "test.txt")) { 
     cerr << "Din't read file, exiting...\n"; 
     return -1; 
    } 
    for(size_t i = 0; i < v.size(); ++i) 
     cout << v[i] << "\n"; 
    return 0; 
} 

輸出:

C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
String 
String2 
String3 

編輯:

我們有一個指針傳遞給我們要修改的內容(也就是string*),否則我們所應用的更改將不會發生。自己測試一下,通過string*作爲參數而不是string**,修改函數的主體,她會發生什麼。

想象一下,想象一下,我們想要寫入指針,新地址,其中new給了我們並持有請求的內存。我們在函數內寫入該地址,但是當函數終止時,我們希望這些更改是持久的。以我的Functions in C爲例。

+0

這可能是一項家庭作業,這是_IF_,它在課堂上使用類似的東西存在限制。 – M4rc

+0

@ M4rc對此做出假設是應該成爲回答者必須遵循的邏輯的一部分,我的意思是什麼?如果它是功課,然後說出來。但是好的,我也會提供另一個版本... – gsamaras

+0

我同意。理想情況下,人們會相應標記這些東西。但是從什麼時候我們生活在一個理想的世界?我認爲這是作業的唯一原因是因爲許多月前我不得不做類似的程序。但是再一次,SO上有人問人們如何編程整個CLI界面。 – M4rc

2

在堆上分配一個數組,像這樣:

std::string* stringArr = new std::string[(place amout of strings here)]; 

不要忘記刪除它在主()

delete stringArr[]; 

變量/陣列的端堆是動態的,所以大小不必被修復!

std::string*→這是一個指針,指向您的內存中此數組的開始地址。 (只是爲了讓您的電腦知道它在哪裏)

stringArr→數組名

new→分配新的內存

std::string[size]→說多少分配

我見過有些答案正在談論「矢量」。如果你想使用它們,你可以看看這個頁面的更多信息! → Vector documentation

+0

你應該使用一個矢量,因爲它會爲你管理內存。 – Kariem

+1

@Kariem在你應該瞭解一個載體之前,你應該學習基礎知識!導致向量使用堆內存 – tistCoder

+1

+1 - 瞭解矢量,地圖等工作方式背後的基本原理的價值遠遠超過簡單地跟隨在所有事情上拋出STL容器的動機。 – M4rc

0

使用矢量

#include <vector> 
#include<fstream> 
#include <iostream> 
using namespace std; 
void reading(int & count, vector<string> * strings) { 
    ifstream fd("text.txt"); 
    fd >> count; 
    string T; 
    for (int i=0; i<count; i++) 
    { 
     fd >> T; 
     strings->push_back(T); 
    } 
    fd.close(); 
} 

int main() { 
    int count=0; 
    vector<string> strings; 
    reading(count, &strings); 
    for (int i=0; i<count; i++) 
     cout << strings[i] << endl; 
}