Я пытаюсь реализовать функцию в C ++, которая ищет строку в файле, а затем печатает строку, содержащую строку AND X последующих строк.
У меня есть следующий код, который работает для поиска строки и печати строки, но я не могу заставить его работать для печати строк под строкой со строкой.
void repturno(void){
system("cls");
string codemp, line,output;
bool found = false;
ifstream myfile ("Pacientes.csv");
//captures the string that i need to look for, in this case an employee code
cout<<"\nBienvenida enfermera en turno, por favor introduzca su codigo"<<endl;
cin.ignore();
getline(cin,codemp);
system("cls");
/*reads the file and searches for the string, then prints the whole line, then searches again for
the string and if finds it, will print the whole line again*/
while (getline(myfile, line)) {
if (line.find(codemp) != string::npos) {
cout<<line<<endl;
getline(myfile,line);
found = true;
}
}
//using this to check if the code was working, and verifying if the string was found or not :P
if( found == false){
cout <<"No se encontro la cadena"<< endl;
}
system("pause");
return menu();
}
Вот мои проблемы:
Я не могу заставить курсор перейти к следующей строке и напечатать ее (нужно сделать это 4 раза), все становится беспорядочным, и я получаю одну и ту же строку, и ее строка печатается по всему экрану много раз.
Я не могу сохранить все данные, относящиеся к каждому сотруднику, в одной строке (это решит проблему в этой функции, но создаст другие проблемы); слишком много информации для каждого сотрудника, более 80 символов, разрешенных в консоли, и это портит другие части моей программы, где я должен отображать информацию на экране, и это выглядит очень плохо, когда я печатаю ее, даже при попытке использовать gotoxy
или же '\t'
для правильного расстояния. Мне приходилось сохранять данные построчно, каждую категорию в отдельной строке, чтобы я мог правильно отображать их в других частях моих программ.
Я пришел с 2 решениями в псевдокоде, но я не знаю, как перевести их в предложения C ++:
НОТА: цикл поиска уже определен в вышеприведенном коде, поэтому не будет разбивать его поэтапно в псевдокоде, будем ссылаться на него как ПОИСК ЦИКЛ
START SEARCH LOOP
SEARCH for the desired string(`codemp`) line by line
IF string is found
PRINTLINE containing the STRING
MOVE CURSOR one line below
PRINT the entire line
MOVE CURSOR one line below
PRINT the entire line
MOVE CURSOR one line below
PRINT the entire line
MOVE CURSOR one line below
PRINT the entire line
Move CURSOR one line below
RESTART SEARCH LOOP in the current line
IF NO matching string is found AND EOF
END IF
END SEARCH LOOP
END PROGRAM
START SEARCH LOOP
SEARCH for the desired string(codemp) line by line
IF string is found
PRINTLINE containing the string
PRINTING LOOP
MOVE CURSOR one line below
ASSIGN line to a temp_string
IF temp_string = "\n\n"//each employee is separated by 2 whitelines after its info
DO NOTHING
ELSE
PRINTLINE temp_string
RESTART PRINTING LOOP
END IF
END PRINTING LOOP
RESTART SEARCH LOOP
IF NO string is found AND EOF
END SEARCH LOOP
END PROGRAM
Я надеюсь, что это ясно и достаточно подробно. Это то, что я хочу сделать с моей программой, но я не могу найти способ перевести ее в предложения C ++. Пожалуйста, дайте мне знать, если есть лучший или более эффективный способ сделать то, что я хочу сделать.
Я не проверял это, но это должно работать:
while( getline(myfile,line) )
{
if( line.find( codemp ) != string::npos )
{
cout << line << endl;
for( int i = 0; i < nbLines && getline( myfile, line ); ++i )
cout << line << endl;
}
}
Итерации файла с while
и когда это find
строка это печатает «nbLines» другие строки «
Поскольку то, что у вас есть, работает для вас, давайте сначала посмотрим на это. Здесь я извлек только соответствующую часть с небольшим дополнением. Все, что нам нужно сделать, это напечатать еще четыре строки в случае, если код был найден, так:
while (getline(myfile, line)) {
if (line.find(codemp) != string::npos) {
cout<<line<<endl;
getline(myfile,line);
found = true;
for (int i=4; i; --i) { <== new code begins
cout << line << '\n';
getline(myfile, line);
} <== new code ends
}
}
Просто как тот.