Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/47: Рейтинг темы: голосов - 47, средняя оценка - 4.64
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
1

Чтение сммволов из файла и переход на новую строку

26.02.2017, 21:38. Показов 8950. Ответов 26

Author24 — интернет-сервис помощи студентам
Здравствуйте, уже час ломаю голову и ищу в инете

Нужно:
считать с файла 12 символов и перейти на новую строку


Сделал функцию:
C++
1
2
3
4
5
bool Str(ifstream &f, char *s)
{
    char buff[12];
    return f.getline(buff, 12)&&(buff == s);
}
при первом вызове считывает ровно 12 символов
при повторном вызове не считывает символы
в чем проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2017, 21:38
Ответы с готовыми решениями:

Переход на новую строку при считывании из файла
Мне нужно прочитать из файла структуру Student, в которой указываются такие данные студента:...

Переход на новую строку
Доброго времени суток! у меня такая проблема: у меня стоит visual C++ 2008 и я не могу перейти на...

Переход на новую строку
Доброго времени суток,как мне изобразить данную фигуру ?Думал просто через printf(" "),но теперь...

Переход на новую строку
Добрый день, цикл должен считывать из файла 12 слов (начиная со второй строки файла), но он этого...

26
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
26.02.2017, 21:42 2
Цитата Сообщение от eXPonent Посмотреть сообщение
при первом вызове считывает ровно 12 символов
Должна прочитать 11. А в строке сколько? Если больше, то будет установлен флаг ошибки, и поток станет нерабочим. Делай буфер с запасом, а лучше в std::string читай.
1
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 21:44  [ТС] 3
как тогда?
считать с файла 12 символов и перейти на новую строку (в строке больше или меньше 12)
строк > 1000
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
26.02.2017, 21:46 4
Считывай строку целиком без ограничений, затем обрежешь её.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
26.02.2017, 21:48 5
Цитата Сообщение от eXPonent Посмотреть сообщение
как тогда?
По-разному можно. Количество символов в строке файла оговорено как-то? Если их меньше 12?
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 21:48  [ТС] 6
в строке до 1 000 000
чтение столька символов очень затруднительно для проца
(количество никак не оговорено в строке даже может быть 0 символов
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
26.02.2017, 21:53 7
О каком процессоре речь? На современных не заметишь.
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 21:55  [ТС] 8
программа должна выполняться в строгие программы по времени
а файлов всего 20
собственно есть функции для установки курсора (ну или позиции) в файле это допустим fseek и fsetpos
только что нашел, только не сообразил пока как ими пользоваться, как сдвинуть на N байт понял а вот как перейти на новую строку?
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
26.02.2017, 22:04 9
Эти функции оперируют позицией и не анализируют концы строк. Т. е. нельзя без считывания отбросить остаток строки.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
26.02.2017, 22:12 10
Цитата Сообщение от eXPonent Посмотреть сообщение
а вот как перейти на новую строку?
http://www.cplusplus.com/refer... am/ignore/
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 22:18  [ТС] 11
f.ignore()
что вернет за значение?

Написал:
C++
1
2
3
4
5
bool Str(ifstream &f, char *s)
{
    char buff[12];
    return f.get(buff, 12)&&(buff == s)&&f.ignore();
}
не сработало
0
187 / 54 / 19
Регистрация: 23.12.2016
Сообщений: 165
26.02.2017, 22:21 12
Всё равно компилятор для перехода на новую строку после считывания 12 символов будет посимвольно анализировать файл, пока не найдет символ перехода на новую строку. Потому не принципиально - считать всю строку или 12 символов и перейти на следующую.
Да и вообще только вчера проверял - большие блоки данных одним куском считываются чуть медленнее чем мгновенно - менее 1 мс времени. Строки читаются медленнее - чтобы считать 11 тыс строк ушло аж 50 мс.

Читать в string, только string переменную объявлять не в цикле, т.к. конструктор её работает достаточно долго, хотя и не критично.
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 22:25  [ТС] 13
будет посимвольно считывать, но не записывать, что экономит память
0
187 / 54 / 19
Регистрация: 23.12.2016
Сообщений: 165
26.02.2017, 22:25 14
Вот как раз статья по скорости считывания разными методами, что мне вчера посоветовали.
https://habrahabr.ru/post/246257/
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
26.02.2017, 22:27 15
eXPonent, тебе же посоветовали ignore() - это как раз без считывания в твой буфер.
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 22:31  [ТС] 16
Цитата Сообщение от eXPonent Посмотреть сообщение
Написал:
C++
1
2
3
4
5
bool Str(ifstream &f, char *s)
{
 char buff[12];
 return f.get(buff, 12)&&(buff == s)&&f.ignore();
}
не сработало
уже писал, что не сработало (с ключами тоже пробовал)

C++
1
2
3
4
5
bool Str(ifstream &f, char *s)
{
    char buff[12];
    return f.get(buff, 12)&&(buff == s)&&f.ignore(1,'\n');
}
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
26.02.2017, 22:35 17
Почему один-то? Надо ставить не меньше, чем их там может быть.
C++
1
f.ignore(std::numeric_limits<streamsize>::max(), '\n');
Про возврат bool не ясно. Для чего?
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 22:41  [ТС] 18
Цитата Сообщение от nmcf Посмотреть сообщение
Почему один-то? Надо ставить не меньше, чем их там может быть.
C++
1
f.ignore(std::numeric_limits<streamsize>::max(), '\n');
Про возврат bool не ясно. Для чего?
Если строки совпадают, тогда сохраняем эту строку
C++
1
buff == s
кстати а как сделать если выполнилось это:
buff == s
то не выполнилась
f.ignore()

просто например я знаю что если:
0&& B = 0
(и B условие вообще не выполняется)
0
7795 / 6561 / 2985
Регистрация: 14.04.2014
Сообщений: 28,683
26.02.2017, 22:49 19
Строки древние так не сравнивают.
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 23:33  [ТС] 20
C++
1
2
3
4
5
6
bool Str(ifstream &f, char *s)
{
    char buff[12];
    f.ignore(INT_MAX,'\n');
    return f.get(buff, 12)&&(buff == s);
}
вопрос первый:
какое максимальное значение можно использовать вместо INT_MAX
например с ULLONG_MAX - не работает
и ещё если строка новая (так как в программе используется) getline(frus,rus,'<');
то функция начинает работать неверно забирая нужную строку

Добавлено через 28 минут
В итоге методом тыка заработала эта функция
C++
1
2
3
4
5
bool Str(ifstream &f, string s)
{
    char buff[12];
    return !(f.get(buff, 12)&&(string(buff) != s)&&f.ignore(LLONG_MAX,'\n'));
}
правда после неё стал некорректно работать счетчик ошибок
(но у меня остались старые значения этой программы, так что не особо нужны)
0
26.02.2017, 23:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2017, 23:33
Помогаю со студенческими работами здесь

Переход на новую строку
Файл открыт в текстовом режиме. Есть строка , ее надо записать в файл, и перейти на новую строку...

Переход на новую строку
Вывести в 5 колонок список пятизначных нечетных симметричных чисел, (например 34543 или 70507)....

Переход на новую строку
фрагмент кода запись строки в текстовый файл: fputs(stroka,f); stroka имеет значение 100110110101...

Переход на новую строку
Что не так? #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { int N;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru