![]() |
|
Модераторы: bsa |
![]()
|
|
| DeadButHappy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 9.8.2010 Где: Russia Репутация: нет Всего: нет |
Дано: текстовый файл input.dat, в котором 2 строки. В каждой строке 3 или 4 числа (за ранее не извесно сколько), разделенные 1 пробелом между собой. Задача: 1 Открыть текстовый файл input.dat для чтения, прочитать данные, закрыть файл, найти сумму чисел каждой строки. 2 Открыть файл повторно, но для записи. Добавить ниже 2 строки: "данные прочитаны успешно" "результат будет записан в файл output.dat" 3 Создать файл output.dat, если такой уже существует, то перезаписать. 4 Записать результат в файл output.dat в следующем виде: Сумма чисел первой строки: 123 Сумма чисел второй строки: 456 Задачу необходимо решить в 2 вариантах: в чистом Си, и С++. (тоесть возможно вариант С++ не будет работать на компиляторе для чистого Си) Среда разработки Dev-C++. Вот что я пока наклепал для 1й части задачи:
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
ты должен читать файл построчно (для этого используй fgets() - C или std::getline() - C++), затем с помощью sscanf(buffer, "%i %i %i %i", &num1, &num2, &num3, &num4) или std::istringstream + std::istream::operator >> ты можешь распарсить прочитанную строку. sscanf возвращает количество удачно расшифрованных параметров, а объект класса std::istream (предок std::istringstream) нужно после каждой операции считывания проверять.
|
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Так как заранее количество чисел в строке неизвестно, нужно устроить разбор строки.
1. Читаете строку (как сказал bsa) 2. Пишите цикл, который находит места пробелов. На этих местах делает atoi от предыдущего пробела (или начала строки) до текущего положения. Это число прибавляете к переменной сумма. 3. Ну а дальше все просто: fprintf в нужные файлы. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
djamshud, пункт 2 ты усложнил. в задании указано, что от 3-х до 4-х чисел в строке. Поэтому сильные извраты ни к чему.
|
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
bsa, зато, когда препод попросит увеличить число чисел, оно взлетит без пинка:). Да и ничего сложного нет: три строки кода и хорошая практика.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
кстати, на С++ будет значительно короче, чем на С:
Это сообщение отредактировал(а) bsa - 24.9.2010, 13:05 |
|||
|
||||
| DeadButHappy |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 9.8.2010 Где: Russia Репутация: нет Всего: нет |
Спасибо за советы. В них в принципе было 99% решения...)
Вот что у меня получилось для варианта на Си:
Если этот код можно сделать чуть больше Си-подобным или просто более грамотно оформленным был бы благодарен за замечания.. Пока попробую осмыслить код на С++, пример которого мне дал bsa... )) Также пока не понял как вместо 1000 указать более правильным количество копируемых символов:
И пока не получилось чтобы вывод в файл производился кириллицей ... Это сообщение отредактировал(а) DeadButHappy - 4.10.2010, 22:10 |
||||
|
|||||
| fuckingniger |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
совет - используй потоки - геморроя ментше
Добавлено через 1 минуту и 6 секунд что бы кириллицей выводить пиши в main в первой его строке setlocale(LC_ALL,"rus"); Добавлено через 3 минуты и 36 секунд fgets(str1, 1000, pointer); вполне приемлимо ... можешь посимвольно считывать пока не встретишь символ '\n' там на самом деле дофига всяких функций есть и не все его видят по-моему - так что осторожно Добавлено через 6 минут и 39 секунд
кстати, на С++ будет значительно короче, чем на С:
просто не могу на это смотреть . Чтобы не писать std:: напиши в препроцессоре(после инклудов) using namespace std и теперь std:: писать не надо |
||||||
|
|||||||
| DeadButHappy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 20 Регистрация: 9.8.2010 Где: Russia Репутация: нет Всего: нет |
||||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
ну да.....препод наверно хотел показать этим заданием что потоки удобнее
|
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 19 Всего: 306 |
||||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Правилом хорошего тона считается ПИСАТЬ std::. Поэтому новичку я и прививаю ПРАВИЛЬНУЮ привычку. Далее, причем тут препроцессор? ты предлагаешь с помощью двоичного редактора изменить исполняемый файл препроцессора, чтобы не писать std? Или ты вообще не знаешь, за что отвечает препроцессор?
Нет. Просто он преподает С и С++ одновременно, что делать категорически нельзя, так как это совершенно разные языки. В одной из книжек подсмотрел: сравнивать эти языки можно так же, как и английский с французским - алфавит в целом совпадает, во французском только добавлено несколько символов, но языки совершенно разные... |
||||
|
|||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
ну скажи а ты сам то пишешь это самое std::??? - по моему это только мешает - надо думать каждый раз к какому пространству имен относится...
если быть уж педантичным сильно можно писать using std::cout итп ну C и ++ не такие уж и разные ) с++ это наследник С )) в терминологии C++))) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
я всегда это ничего не меняет.. |
|||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |