С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
1

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

26.02.2017, 21:38. Просмотров 1169. Ответов 26

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

Нужно:
считать с файла 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2017, 21:38
Ответы с готовыми решениями:

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

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

Переход на новую строку
Что не так? #include <iostream> #include <string> using namespace std; int...

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

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

26
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
26.02.2017, 21:42 2
Цитата Сообщение от eXPonent Посмотреть сообщение
при первом вызове считывает ровно 12 символов
Должна прочитать 11. А в строке сколько? Если больше, то будет установлен флаг ошибки, и поток станет нерабочим. Делай буфер с запасом, а лучше в std::string читай.
1
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 21:44  [ТС] 3
как тогда?
считать с файла 12 символов и перейти на новую строку (в строке больше или меньше 12)
строк > 1000
0
nmcf
6517 / 5746 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 21:46 4
Считывай строку целиком без ограничений, затем обрежешь её.
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
26.02.2017, 21:48 5
Цитата Сообщение от eXPonent Посмотреть сообщение
как тогда?
По-разному можно. Количество символов в строке файла оговорено как-то? Если их меньше 12?
0
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 21:48  [ТС] 6
в строке до 1 000 000
чтение столька символов очень затруднительно для проца
(количество никак не оговорено в строке даже может быть 0 символов
0
nmcf
6517 / 5746 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 21:53 7
О каком процессоре речь? На современных не заметишь.
0
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 21:55  [ТС] 8
программа должна выполняться в строгие программы по времени
а файлов всего 20
собственно есть функции для установки курсора (ну или позиции) в файле это допустим fseek и fsetpos
только что нашел, только не сообразил пока как ими пользоваться, как сдвинуть на N байт понял а вот как перейти на новую строку?
0
nmcf
6517 / 5746 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 22:04 9
Эти функции оперируют позицией и не анализируют концы строк. Т. е. нельзя без считывания отбросить остаток строки.
0
nd2
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
26.02.2017, 22:12 10
Цитата Сообщение от eXPonent Посмотреть сообщение
а вот как перейти на новую строку?
http://www.cplusplus.com/reference/istream/istream/ignore/
0
eXPonent
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
altmax
181 / 48 / 19
Регистрация: 23.12.2016
Сообщений: 158
Завершенные тесты: 1
26.02.2017, 22:21 12
Всё равно компилятор для перехода на новую строку после считывания 12 символов будет посимвольно анализировать файл, пока не найдет символ перехода на новую строку. Потому не принципиально - считать всю строку или 12 символов и перейти на следующую.
Да и вообще только вчера проверял - большие блоки данных одним куском считываются чуть медленнее чем мгновенно - менее 1 мс времени. Строки читаются медленнее - чтобы считать 11 тыс строк ушло аж 50 мс.

Читать в string, только string переменную объявлять не в цикле, т.к. конструктор её работает достаточно долго, хотя и не критично.
0
eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
26.02.2017, 22:25  [ТС] 13
будет посимвольно считывать, но не записывать, что экономит память
0
altmax
181 / 48 / 19
Регистрация: 23.12.2016
Сообщений: 158
Завершенные тесты: 1
26.02.2017, 22:25 14
Вот как раз статья по скорости считывания разными методами, что мне вчера посоветовали.
https://habrahabr.ru/post/246257/
0
nmcf
6517 / 5746 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 22:27 15
eXPonent, тебе же посоветовали ignore() - это как раз без считывания в твой буфер.
0
eXPonent
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
nmcf
6517 / 5746 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 22:35 17
Почему один-то? Надо ставить не меньше, чем их там может быть.
C++
1
f.ignore(std::numeric_limits<streamsize>::max(), '\n');
Про возврат bool не ясно. Для чего?
0
eXPonent
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
nmcf
6517 / 5746 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
26.02.2017, 22:49 19
Строки древние так не сравнивают.
0
eXPonent
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2017, 23:33

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru