В чём заключается ошибка в двумерном массиве?
Нужно записать каждую строчку в отдельный элемент массива C++. Вот код:
char* sentence = new char[N];
char** sentences_1 = new char*[N];
int i = 0;
while (fgets(sentence, N, file) != NULL) {
sentences_1[i] = new char[N];
sentences_1[i] = sentence;
cout << sentences_1[i];
i++;
}
cout << endl << endl;
for (int k = 0; k < 4; k++) {
cout << sentences_1[k] << endl;
}
Выводится следующее:
Asdf
Bsdf
Csdf
Lsdf
Lsdf
Lsdf
Lsdf
Lsdf
В файле:
Asdf
Bsdf
Csdf
Lsdf
Объясните почему выводит во втором цыкле последний элемент, хотя в первом всё ок. Может я чего то не понимаю, я новичок)
Ответы (2 шт):
Автор решения: Артём Оконечников
→ Ссылка
sentences_1[i] = sentence;
Вы присваиваете элементу массива sentences_1 указатель на строку, а не копируете её. Затем, в цикле, меняете содержимое строки fgets(sentence, N, file).
Ва нужно скопировать строку, а не указатель:
std::strcpy(sentences_1[i], sentence);
Автор решения: SelfishCrawler
→ Ссылка
Возможно, если нет требования к конкретно использованию FILE, fgets и char* массива, Вас устроит такой вариант, который еще и выглядит покороче:
#include <iostream>
#include <fstream>
#include <string>
#define N 3
using namespace std;
int main()
{
ifstream fin("test.txt");
string file[N];
for (int i = 0; getline(fin, file[i]); i++);
for (int i = 0; i < N; i++)
cout << file[i] << endl;
}
Или даже вариант с заранее неизвестным количеством строк в файле:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
ifstream fin("test.txt");
vector<string> file;
string buf;
while (getline(fin, buf))
file.push_back(buf);
for (auto it = file.begin(); it != file.end(); it++)
cout << *it << endl;
}