2014-01-08 2 views
0

Я имею следующий код в C++Сохранение данных из файла в двухмерном массиве в C++

char *Names[]; 
int counter=0; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int data; 
    ifstream fileX; 
    fileX.open("myfile",ios::in); 
    assert (!fileX.fail()); 
    fileX >> data; 
    while(fileX!=eof()) 
    { 
     createNamesList(data); 
     fileX >> data; 
    } 
    return 0; 
} 

void createNamesList(char *tmp) 
{ 
    Names[counter] = tmp; 
    counter++; 
} 

То, что я хочу, чтобы прочитать данные из файла построчно и хранить каждую строку в два измерения array char* Names[], чтобы весь список был сохранен вместе со мной. размер данных в каждой строке - это переменная длина, а также количество строк; как

Name[0] ="Data from Line 1" 
Name[1] ="Data from Line 2" 
Name[2] ="Data from Line 3" 
Name[3] ="Data from Line 4" 
. 
. 
. 

Приведенный выше код дает мне следующую ошибку

ошибка LNK2001: неразрешенный внешний символ "символ ** Имена" (? Имена @@ 3PAPADA)

Ваша помощь будут оценены.

+0

Что вы ожидаете от первой строки кода 'char * Names [];' делать? –

+0

@ davidSchwartz, берущий два тусклых массива и сохраняющий строки по значениям строки из файла в нем – user3069453

+0

Я просто спрашиваю, что вы ожидаете от первой строки кода. Будьте настолько конкретны, насколько сможете. –

ответ

2

Сообщение об ошибке, которое вы видите, едва ли является верхушкой айсберга в проблемах с этим кодом.

Я бы рекомендовал использовать классы std::vector и std::string, включенные в ваш компилятор, чтобы сделать это немного проще.

int main() { 
    std::ifstream fileX("myfile"); 

    std::vector<std::string> Names; 

    std::string temp; 
    while (std::getline(fileX, temp)) 
     Names.push_back(temp); 
    return 0; 
} 
+0

Если доступен C++ 11, лучше использовать 'Names.push_back (std :: move (temp))', потому что его значение отбрасывается после нажатия любым способом. –

+0

И когда C++ 11 недоступен, каждый раз, когда вектор должен расширять свою емкость, он копирует содержимое каждой строки, делая этот метод крайне неэффективным. –

+0

@ C.R .: В лучшем случае это иногда немного лучше. Это означает, что когда вы читаете следующую строку, 'temp' должен выделять новый буфер, так что вы приобрели в' push_back', вы теряете снова сразу после этого. «Крайне неэффективный» - это чистая чепуха. В то время как содержимое * do * копируется, 'vector' изменяет размерность геометрически, поэтому количество копий стремится к константе (обычно около 3). Он тестировался тысячи раз при любых условиях и вполне надежно выполняет * очень хорошо. –

Смежные вопросы