Как читать в пустых строках из файла .txt в массив символов

В моей программе я должен построчно читать текстовый файл, искать самый длинный палиндром и возвращать его номер строки.

Каждый текстовый файл имеет длину 100 000 строк и максимальную длину 15.

С моим кодом я могу читать каждую строку в

char lines[100000][15]

За исключением пустых строк, которые отбрасывают мой расчет, в какой строке содержится самый длинный палиндром.

Например, файл, содержащий: (0: строка 0, 1: строка 1 и т. Д.)

0: hello
1: bob
2: joe
3:
4: cat

Приходит как:

0: hello
1: bob
2: joe
3: cat
4: (whatever 5: would be)

Вот мой код для чтения файла:

std::ifstream theFile;
theFile.open(argv[1]);

char lines[100000][15];
for (int i = 0; i < 100000; i++)
{
for (int j = 0; j < 15; j++)
{
lines[i][j] = '\0'; //I do this to initialize each char to null
}
}

while (!theFile.eof())
{
for (int i = 0; i < 100000; i++)
{
theFile >> lines[i];
}
}

Я предполагаю, что проблема заключается в строке:

theFile >> lines[i];

не копировать символы новой строки или другие символы форматирования, но я не уверен, как обойти это, поэтому любая помощь будет оценена.

Я должен использовать массив массивов символов, кстати, потому что я использую MPI для передачи данных, и я могу отправлять только символы, а не массивы / строки.

-1

Решение

Вместо этого попробуйте функцию getline (и исправьте цикл) следующим образом

 for (int i = 0; theFile.getline ( lines[i],14) && i < 100000; i++)
;
1

Другие решения

GetLine есть версия, где вы можете указать разделитель. Версия по умолчанию будет работать, когда она встречает новую строку, поэтому не используйте ее.

0

Вам не нужно хранить все строки в памяти. Просто читайте по одной строке за раз. Если линия является палиндромом и она длиннее самой длинной, которую вы когда-либо видели, сохраните ее длину и номер строки. Затем увеличьте счетчик строк. Что-то вроде этого:

long line_number = 0;
int longest_length = -1;
long longest_number = -1;
std::string line;
while (theFile.getline(line)) {
if (is_palindrome(line) && longest_length < line.length()) {
longest_length = line.length();
longest_line = line_number;
}
++line_number;
}
0

Я отказался от попыток поместить их непосредственно в массив массивов символов. Я сделал это вместо этого, используя getline и vector.

std :: ifstream theFile;
theFile.open (ARGV [1]);

std::vector<std::string> Lines;
std::string workString;
while(std::getline(theFile,workString))
{
Lines.push_back(workString);
workString.clear();
}
theFile.close();

char lines[100000][15];
for (int i = 0; i < 100000; i++)
{
for (int j = 0; j < 15; j++)
{
lines[i][j] = '\0';
}
}for (int i = 0; i < 100000; i++)
{
for (int j = 0; j < Lines[i].size(); j++)
{
lines[i][j] = Lines[i][j];
}
}
0