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
4582
Если использовать 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, Супермодераторы



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

Сейчас этот форум просматривают: =SSN=


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

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