В моей программе я должен построчно читать текстовый файл, искать самый длинный палиндром и возвращать его номер строки.
Каждый текстовый файл имеет длину 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 для передачи данных, и я могу отправлять только символы, а не массивы / строки.
Вместо этого попробуйте функцию getline (и исправьте цикл) следующим образом
for (int i = 0; theFile.getline ( lines[i],14) && i < 100000; i++)
;
GetLine есть версия, где вы можете указать разделитель. Версия по умолчанию будет работать, когда она встречает новую строку, поэтому не используйте ее.
Вам не нужно хранить все строки в памяти. Просто читайте по одной строке за раз. Если линия является палиндромом и она длиннее самой длинной, которую вы когда-либо видели, сохраните ее длину и номер строки. Затем увеличьте счетчик строк. Что-то вроде этого:
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;
}
Я отказался от попыток поместить их непосредственно в массив массивов символов. Я сделал это вместо этого, используя 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];
}
}