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

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

26.02.2017, 21:38. Просмотров 994. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Чтение сммволов из файла и переход на новую строку (C++):

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

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

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

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

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

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

26
nd2
2828 / 2398 / 1054
Регистрация: 29.01.2016
Сообщений: 8,022
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
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,376
26.02.2017, 21:46 #4
Считывай строку целиком без ограничений, затем обрежешь её.
0
nd2
2828 / 2398 / 1054
Регистрация: 29.01.2016
Сообщений: 8,022
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
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,376
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
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,376
26.02.2017, 22:04 #9
Эти функции оперируют позицией и не анализируют концы строк. Т. е. нельзя без считывания отбросить остаток строки.
0
nd2
2828 / 2398 / 1054
Регистрация: 29.01.2016
Сообщений: 8,022
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
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,376
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
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,376
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
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,376
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 имеет...

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

Переход на новую строку после 10 чисел
Программа для вывода чисел между двумя числами. Нужно сделать так, чтобы через...

Sprintf не видит переход на новую строку
Привет всем Появилась проблемка пытаюсь записать в массив через sprintf но он...


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

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

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