2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4  След.
 
 Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 14:56 
Аватара пользователя


21/06/12
184
На разных сайтах написано по-разному. Да и совсем непонятно.
Мне нужно научится работать с текстовыми файлами(считывать и записывать информацию).
Нужно для олимпиад по программированию. Может кто доходчиво объяснить самый оптимальный способ?
Особенно непонятно становится, когда нужно считывать данные не с одной строки, а с нескольких, вида:
5
1 2 3 4 5
5 2
2 4 5 6

Пока тренируюсь на таких сайтах, как http://acm.timus.ru и http://acm.timus.ru

Можете показать на примере задач с http://acm.timus.ru

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 16:48 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Если для олимпиад по программированию, то лучше всего возьмите способ, употребляющийся в каком-нибудь готовом решении, и заучите его наизусть до автоматизма. И не заморачивайтесь на оптимальности. Нужно, чтобы во время олимпиады эту часть писал спинной мозг, не отвлекая головной.

Ещё, если вы выступаете в команде, лучше всем заучить наизусть одно и то же, чтобы на перекрёстном чтении текстов не спотыкаться.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 17:04 
Аватара пользователя


21/06/12
184
Munin в сообщении #601548 писал(а):
Если для олимпиад по программированию, то лучше всего возьмите способ, употребляющийся в каком-нибудь готовом решении, и заучите его наизусть до автоматизма. И не заморачивайтесь на оптимальности. Нужно, чтобы во время олимпиады эту часть писал спинной мозг, не отвлекая головной.

Ещё, если вы выступаете в команде, лучше всем заучить наизусть одно и то же, чтобы на перекрёстном чтении текстов не спотыкаться.

Оптимальный - я и имел ввиду самый простой способ.
Я и хочу заучить какой-нибудь способ, но не знаю, какой. Ибо в примерах все совсем непонятно.

Вот на сайте, приведенном выше, такой пример:

Используется синтаксис C++
#include <stdio.h>

long a,b;

int main(){
  freopen("input.txt","r",stdin);
  freopen("output.txt","w",stdout);
  scanf("%ld%ld",&a,&b);
  printf("%ld",a+b);
  return 0;
}

Я не понимаю, что здесь значит:
Используется синтаксис C++
"%ld%ld", &,  

Не понимаю, как считать данные, если они записаны хаотично(в несколько строчек с разными вариантами расположения)
Как записать в несколько строчек, как вообще указать форматирование при записи в файл.
Да вообще эту тему очень туманно представля.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 17:29 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Если вы не знаете, что значит &, вы недостаточно знаете C/C++. Это оператор взятия адреса.
scanf - старая функция, созданная ещё для раннего C, в те времена, когда способов передачи параметров по ссылке не было, и поэтому она требует передачи не параметров, а их адресов, чтобы записать в них возвращаемые значения.

Если вы на олимпиадах всегда пользуетесь C++, и никогда - чистым C, то лучше использовать потоки <iostream>, а не средства <stdio> printf и scanf. В примерах можете их опознать по использованию перегруженных операторов << и >>. Но это совет для "нормального программирования", а на олимпиадах могут быть особые требования к обработке неправильных входных данных, и к гибкому формату входных данных (например, неопределённое количество элементов в строке), для этого надо овладеть возвращаемыми значениями и сообщениями об ошибках чтения, тут не уверен, что <iostream> выигрывает у <stdio> по простоте.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 17:32 
Заслуженный участник


04/05/09
4587
Если использовать scanf(), то расположение данных по строкам файла не важно - при чтении перевод строки воспринимается так же, как и пробел. Просто организуйте нужные циклы, и читайте хоть по одному элементу.
Ещё не забывайте, что чтение строки через scanf("%s") тоже остановится на очередном пробеле.
Есть, конечно, возможность читать до конца строки, если это понадобится: gets(), fgets() и другие аналоги.

-- Вт июл 31, 2012 10:38:55 --

Munin в сообщении #601567 писал(а):
тут не уверен, что <iostream> выигрывает у <stdio> по простоте.
Главная проблема iostream - это производительность. Авторы библиотеки C++ умудрились так наворотить, что в результате ввод/вывод через iostream в несколько раз медленнее, чем scanf()/printf(). Обычно это не существенно, но в некоторых задачах входные или выходные данные очень большие, и iostream может критично затормозить исполнение. Я для задач, в оценке которых использовалось время исполнения, иногда даже писал собственный парсер или форматтер, т.к. даже scanf()/printf() были недостаточно быстрыми.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 17:46 
Аватара пользователя


21/06/12
184
Можете дать ссылку на метериал, где очень доступно объясняется какой-нибудь простой(достаточный для олимпиадных задач и работы с текстовыми файлами) метод?
Или попробовать объяснить сами понятным языком.

Как считывать данные, если они расположены в нескольких строках в разных количествах.
Вот, например, как здесь в 4 задаче

Как записывать данные, если их просят записать с различными форматировками(через пробел, без пробела, несколько строк по столько-то символов в каждой и так далее).

И если переменных немало, то надо обозначать их все, типа такого : int a,b,c,d,e,f и так далее, чтобы считать?

Вот, например, в этой задаче чтобы считать вес и количество всех арбузов, нужно обозначать 6 переменных?

Вообщем хотелось бы увидеть понятное структурное объяснение, чтобы было более-менее понятно.
А то задачи как решать знаю, но не могу на тест отправить, так как почти всегда ошибка в чтении/записи и вообще работе с файлами.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 17:53 
Заслуженный участник
Аватара пользователя


30/01/06
72407
venco в сообщении #601571 писал(а):
Главная проблема iostream - это производительность.

Вот актуально ли это для олимпиадного программирования?

Ubermensch в сообщении #601579 писал(а):
И если переменных немало, то надо обозначать их все, типа такого : int a,b,c,d,e,f и так далее, чтобы считать?

Вот, например, в этой задаче чтобы считать вес и количество всех арбузов, нужно обозначать 6 переменных?

В этой задаче надо можно использовать создаваемый динамически массив (или vector), и в цикле считывать элементы вектора. В примере дано 6 арбузов, а в тесте, на котором будут проверять ваше решение, их будет 586.

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

-- 31.07.2012 18:57:27 --

Ubermensch в сообщении #601579 писал(а):
Можете дать ссылку на метериал, где очень доступно объясняется какой-нибудь простой(достаточный для олимпиадных задач и работы с текстовыми файлами) метод?

Google "printf scanf"
Google "cin cout"
в первых же результатах поиска много учебников, tutorial-ов и объяснений.

-- 31.07.2012 19:02:47 --

Ubermensch в сообщении #601579 писал(а):
А то задачи как решать знаю, но не могу на тест отправить, так как почти всегда ошибка в чтении/записи и вообще работе с файлами.

Может быть, вам больше знаком другой язык, например, паскаль, и стоит профилироваться на нём? Я гляжу, ещё указаны как распространённые варианты VB и Java. На крупных олимпиадах обычно предоставляют богатый выбор, чтобы не ставить участников в неравные условия по тому, на чём они привыкли писать.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 18:08 
Аватара пользователя


21/06/12
184
Цитата:
Может быть, вам больше знаком другой язык, например, паскаль, и стоит профилироваться на нём? Я гляжу, ещё указаны как распространённые варианты VB и Java. На крупных олимпиадах обычно предоставляют богатый выбор, чтобы не ставить участников в неравные условия по тому, на чём они привыкли писать.

На C++ будет лучше. Через год поступаю в универ, а там уже паскаля не будет. Будут уже промышленные языки. Да и там с олимпиадниками занимаются на C++. Да и знаю я сейчас лучше C++, чем Паскаль, в плане ситаксиса.

Со входными данными, где используютс 1-2 переменных в строчку и вывод 2-3 переменных в стрчоку я как-то справляюсь.
Но когда нужно считывать и записывать из нескольких строк(таблиц) в несколько строк(таблиц) - то здесь уже различные ошибки вылетают.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 18:09 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Хм. Бывают олимпиадные задачи, которые проходят с stdio и не проходят с iostream из-за Time Limit Exceeded. Пример: http://acmp.ru/asp/gb.asp?id=82

Так что, возможно лучше ориентироваться на stdio.

-- 31.07.2012 19:12:55 --

Ubermensch в сообщении #601593 писал(а):
На C++ будет лучше. Через год поступаю в универ, а там уже паскаля не будет. Будут уже промышленные языки.

Интересно, а что сегодня считается промышленными языками? Delphi, вроде бы, всё же широко распространён, а это тот же паскаль. Да и вообще, странно было бы изучать "промышленные языки", и при этом узко ограничивать их набор. Впрочем, может, я чего-то не знаю.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 18:19 
Аватара пользователя


21/06/12
184
Delphi, как мне известно сугубо из почитывания habrahabr.ru и тому подобных сайтов, используется крайне редко, а то, что используется, это в основе своей в СНГ и в основе своей только для поддержки(!) старого кода.

Ну сегодня промышленными языками считаются C++/C, Java, C#, Phyton. Это наиболее популярные, причем Java по количеству вакансий лидирует. Ну это не считая разных PHP для сайтостроения и тому подобное.

Ну не хочется тратить время, чтобы занаво учить синтаксис Java или чего-нибудь еще.
В универе уже буду учить побольше, а сейчас время лучше потратить на подготовку к республиканской олимпиаде. Благо, там диплом, который дают первым 50-55 людям, реальнее получить, чем по математике.
А диплом позволяет без экзаменов на бюджет поступать

-- 31.07.2012, 18:12 --

Как можно считывать данные в этойзадаче?
И в чем у меня ошибка? Только заметил, что неправильно работает, когда во второй строке стоит $0$
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>
int a,b,s0=0,s1=0;

int main(){
  freopen("input.txt","r",stdin);
  freopen("output.txt","w",stdout);
  scanf("%ld%ld",&a,&b); // Можно обозначить а количество монет, а b считывать как орел или решка(1 или 0).
 
  for(int i=0; i<a;i++)
  { scanf("%ld", &b);// Считываем 1 или 0
   if (b==1){s1++;}
   if (b==0){s0++;} }
   if (s1<s0)
   { printf("%ld",s1);}
 
   if (s1>s0)
   { printf("%ld",s0);}
 
  return 0;       }
 

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 19:46 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Ubermensch в сообщении #601599 писал(а):
Используется синтаксис C++
int a,b;
  // ...
  scanf("%ld%ld",&a,&b);

Этой командой вы считываете два числа из входного файла в две переменные: в a и в b. Дальше то, что вы считали в b, вы никак не используете, и затираете следующей же командой чтения. Получается, одно число из входного файла у вас пропадает без вести. Правильно было бы считать в этом месте только переменную a:
Используется синтаксис C++
int a,b;
  // ...
  scanf("%d",&a);

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 19:53 
Аватара пользователя


21/06/12
184
Munin, Вы правы. Исправил на то, что Вы написали и программа прошла тест.

Попробую интуитивно разобраться с файлами. Если опять возникнут ошибки, то спрошу здесь. Но я попробую впредь проверять более внимательно.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 20:02 
Заслуженный участник


28/04/09
1933
Ubermensch
Если s1 равно s0, Ваша программа ничего не выдаст.

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 20:02 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Чего ж интуитивно-то?
http://sernam.ru/c_19.php
http://www.realcoding.net/article/view/1633
http://wpollock.com/CPlus/PrintfRef.htm
http://acm.timus.ru/help.aspx?topic=cpp

 Профиль  
                  
 
 Re: Помогите разобраться, как работать с файлами на C++
Сообщение31.07.2012, 20:21 
Аватара пользователя


21/06/12
184
Я уже сам догадался до случая s1=s0, когда тестировал программу вручную. Спасибо за внимание.

Munin, мне в этих статьях многое непонятно почему-то. Но я уже интуитивно кое-что понял, чего раньше не мог понять.

Например что %ld - это место переменной.

Еще я правильно понял, что программа попорядку считывает числа? А уже второй прогон она не пойдет, так как дойдет до окончания файла?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу 1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group