Форум программистов, компьютерный форум CyberForum.ru

много вопросов о вводе-выводе - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
03.02.2011, 09:54     много вопросов о вводе-выводе #1
Здравствуйте, законченный дельфист решил переехать... вопросов куча, просьба ответить.
1) много вариантов ввода вывода, например сравниать <<, >> и scanf printf по сути они аналогичны? Считается ли каой-то вариант более выгодным или красивым?
2) зачем в scan и print дополнительно указывать тип, если он уже задан при объявлении переменой.
3) при объявлении int a=0; int a={0} ; эти две команды аналогичны? что значат эти круглые скобки. есть ли разница.
4) почему без начального присваивания нельзя прочитать значение с помощью scan, а из потока можно.
int a; scanf("d",a); выдается ошибка.
5) если у меня куча переменных инт, могу я их разом обнулить (нач. присваивание), типа k1,k2,k3,k4=0;
6) при чтении и файла, что значит %d чем отличается от просто d , зачем пишется & перед переменной?
fscanf("%d",&a);
7) как прочитать числа через пробел из файла.
вариант fscanf("%d",k1,k2,k3,k4); не работает, кстати вот это "%d" относится ко всем или только к первому?
8) как сделать из файла стандартный потом, нашел вариант название исполн файла<<input.txt но если я не знаю как называется exe файл? или вдруг ег переименуют.
нашел как сделать из файла потом и читать как in<< и out>> но cin=in; con=out; не работает.
топик будет дополняться) спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dampir_sanek
149 / 147 / 21
Регистрация: 09.02.2010
Сообщений: 407
03.02.2011, 13:06     много вопросов о вводе-выводе #2
AC-93,
ответ на вопрос 1:
<< и >> это операторы языка С++, а printf, scanf - это язык С. Лучше и красивее использовать printf, scanf в программе на С, а >> , << в программе на С++.
ответ на вопрос 2: таков синтаксис языка. И разве это имеет значение? Писать printf("%d", i) или как то иначе? Синтаксис языка С - это один из самых красивых и лаконичных синтаксисов.

Добавлено через 1 минуту
Код
C
1
int a; scanf("d",a);
работать не будет, нужно так
C
1
int a; scanf("%d",a);
Escapable
53 / 53 / 1
Регистрация: 09.11.2010
Сообщений: 120
03.02.2011, 13:20     много вопросов о вводе-выводе #3
3. Такие скобки ({}) используются для начальной инициализации массивов.
C++
1
int a[5] = {0, 1, 2, 3, 4}; // челочисленый массив состоящий из пяти элементов
5. Да.
C++
1
2
3
4
5
int a = 5, b = 10, с = 15;
cout << a << " " << b << " " << с << endl; // на экране 5 10 15
 
a = b = с = 0; // обнуляем
cout << a << " " << b << " " << с << endl; // на экране 0 0 0
dampir_sanek
149 / 147 / 21
Регистрация: 09.02.2010
Сообщений: 407
03.02.2011, 13:27     много вопросов о вводе-выводе #4
6 вопрос:
%d -подстановка в это место значения типа int, которая указана после запятой.

& перед переменной?
Вы уже наверное заметили, что когда мы в scanf указываем переменные, в которые нужно поместить считываемые данные, то перед именем переменной ставим знак & (амперсанд), в то время как в printf при печати значений переменных амперсанд не ставится.

Операция «амперсанд» — это операция взятия адреса. Если a есть значение переменной a, то &a — это адрес в памяти компьютера, где хранится переменная a: одно есть само число, другое — место, где это число хранится.

Функции scanf нужно знать не текущее значение переменной, а её адрес, чтобы положить туда результат считывания. Функции printf нужно знать значения переменных, чтобы их печатать. Функции scanf нужно передавать адреса переменных, куда помещать считываемые данные.
отсюда

Добавлено через 4 минуты
8 вопрос: сами поняли что написали? В чем вопрос то?
топик будет дополняться) спасибо
Перед дополнением топика,попробуйте книжки почитать. Ваши вопросы - это первый параграф в любой книге по Си/Си++.
Модно начать с книги Керниган, Ритчи "Язык программирования Си"
silent_1991
03.02.2011, 14:01
  #5

Не по теме:

Цитата Сообщение от dampir_sanek Посмотреть сообщение
<< и >> это операторы языка С++
Вообще это операторы языка Си, и их изначальное значение - побитовый сдвиг. А уж разработчики Си++ только перегрузили эти операторы для передачи и взятия из потока. Но в определённом контексте эти операторы так и остаются операторами сдвига.

dampir_sanek
149 / 147 / 21
Регистрация: 09.02.2010
Сообщений: 407
03.02.2011, 14:08     много вопросов о вводе-выводе #6
silent_1991, да Вы конечно правы. Я имел ввиду это в контексте операторов cout, cin. А так дельное замечание.
Mogul-kan
23 / 23 / 2
Регистрация: 24.04.2010
Сообщений: 220
03.02.2011, 14:25     много вопросов о вводе-выводе #7
Цитата Сообщение от dampir_sanek Посмотреть сообщение
int a; scanf("%d",a);
и так работать не будет-вы забыли амперсанд... в языке си это происхоит так
C
1
scanf("%d", & a);
амперсанд &-содержит адрес ячейки куда будут ложить переменную без него во всяком случае в си не заработает...

Цитата Сообщение от AC-93 Посмотреть сообщение
5) если у меня куча переменных инт, могу я их разом обнулить (нач. присваивание), типа k1,k2,k3,k4=0;
можно сделать так:
C
1
к1=к2=к3=0;
Цитата Сообщение от AC-93 Посмотреть сообщение
вариант fscanf("%d",k1,k2,k3,k4); не работает, кстати вот это "%d" относится ко всем или только к первому?
%d-относится только к первому(поэтому нужно ставить для каждой переменной)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.02.2011, 14:29     много вопросов о вводе-выводе #8
Цитата Сообщение от Mogul-kan Посмотреть сообщение
амперсанд &-содержит адрес ячейки
Амперсанд ничего содержать не может, это оператор. Он возвращает адрес ячейки памяти своего операнда.

Не по теме:

Что-то я сегодня злобный и к словам придираюсь

AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
03.02.2011, 16:42  [ТС]     много вопросов о вводе-выводе #9
Огромное спасибо за ответы) По красивости С не соглашусь) Мне операции read и write кажутся более логичными) без всяких доп. символов легко и красиво) Но тут на вкус и цвет)


Цитата Сообщение от dampir_sanek Посмотреть сообщение
Добавлено через 4 минуты
8 вопрос: сами поняли что написали? В чем вопрос то?

Перед дополнением топика,попробуйте книжки почитать. Ваши вопросы - это первый параграф в любой книге по Си/Си++.
Модно начать с книги Керниган, Ритчи "Язык программирования Си"
Читаю программирование на С++ Глушаков. Дуравкин 2008. и С-С++ Культин.
То, что пишу тут, оттуда понять не смог. Во всех учебниках дается как работать и писать но тонкости не описаны.


8) упс не так написал, клава незнакомая тут.
у меня есть файл из которого читаю, можно ли сделать из этого файла стандартный поток, чтобы читать из него с помощью scanf printf, чтобы не писать каждый раз откуда читаешь fscanf(название,обычные символы для чтения)
Нашел вариант в книге что что этого надо прописать
C++
1
название_файла_exe<<название файла из которого читаем.
но этот вариант не подходит т.к. не знаю название exe и при его переименовании все перестанет работать.
Нашел второй вариант-сделать из файла поток
C++
1
2
ofstream os("text.txt");
os << "Hello";
но на команду cin=os; он начинает ругаться. т.е. опять не плучается с помощью scanf() читать.

про 7 вопрос не понял

и если я не хочу закорачиваться с амперсандами и типами при чтении, могу забыть про все это и использовать << >> или в каких-то случаях погорю на этом?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.02.2011, 19:44     много вопросов о вводе-выводе #10
Цитата Сообщение от AC-93 Посмотреть сообщение
По красивости С не соглашусь) Мне операции read и write кажутся более логичными
Отличаете лаконичность языка от самописных функций? Да, функции printf/scanf входят в стандарт, но от этого они не перестают быть функциями, написанными каким-то программистом/группой программистов. Вам никто не мешает написать свои собственные функции работы с потоками, в которых не будет "ничего лишнего", зато будут блэк-джэк и шлю...
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
03.02.2011, 19:47  [ТС]     много вопросов о вводе-выводе #11
Цитата Сообщение от dampir_sanek Посмотреть сообщение

Перед дополнением топика,попробуйте книжки почитать. Ваши вопросы - это первый параграф в любой книге по Си/Си++.
Модно начать с книги Керниган, Ритчи "Язык программирования Си"
Прочитал эту книжку. В 7 главе как раз об этом, нашел ответ там на 7 вопрос. Остальных нету.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.02.2011, 19:49     много вопросов о вводе-выводе #12
Далее.
Пишите либо на Си, используя printf/scanf, либо на Си++, используя потоки. Никогда не смешивайте эту часть языков (работа с потоками).
Для Си, чтобы использовать стандартные функции printf/scanf для работы с вашим файлом, а не со стандартными потоками ввода/вывода, существует функция freopen. Поищите про неё в гугле, я её синтаксис не помню.
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
03.02.2011, 20:01  [ТС]     много вопросов о вводе-выводе #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
Отличаете лаконичность языка от самописных функций? Да, функции printf/scanf входят в стандарт, но от этого они не перестают быть функциями, написанными каким-то программистом/группой программистов. Вам никто не мешает написать свои собственные функции работы с потоками, в которых не будет "ничего лишнего", зато будут блэк-джэк и шлю...
Ахаха) Супер) Пошел переписывать все функции делфи в сишку) Интересно примут ли такие решения. Блек джек и шл... и С++ АХаха. Супер

Добавлено через 45 секунд
На будущее: В шарпе потоки или стандартный ввод вывод?

Добавлено через 1 минуту
Отлично, freopen понял, то что надо.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.02.2011, 20:11     много вопросов о вводе-выводе #14
Цитата Сообщение от AC-93 Посмотреть сообщение
Пошел переписывать все функции делфи в сишку
Это я вам как вариант предложил. Второй вариант - учите Си++, там поудобнее работа с потоками, тоже никаких "дополнительных символов".
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
03.02.2011, 20:21  [ТС]     много вопросов о вводе-выводе #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <stdio.h>
#include <fstream> 
 
 
using namespace std;
int main()
{   int a;
    freopen("input.txt","r",cin);
    freopen("output.txt","w",cout);
    cin>>a;
    cout<<a;
    return(0);
}
ругается
*: error C2664: 'freopen' : cannot convert parameter 3 from 'std::istream' to 'FILE *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
*: error C2664: 'freopen' : cannot convert parameter 3 from 'std::ostream' to 'FILE *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

пытаюсь перенаправить из файлов в стандартный поток ввода-вывода

Добавлено через 1 минуту
и кстати как комментировать код не по строчкам? Чтобы блоком целым.
конечно я буду учить С++) Тем более потоки довольно красивые.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
03.02.2011, 20:27     много вопросов о вводе-выводе #16
Цитата Сообщение от AC-93 Посмотреть сообщение
и кстати как комментировать код не по строчкам? Чтобы блоком целым.
C++
1
2
/*some 
code*/
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.02.2011, 20:54     много вопросов о вводе-выводе #17
AC-93, блин. Ну сказал же ясно, не мешать Си и Си++ потоки. А вы это умудрились не в пределах программы сделать, а в пределах операции. Не сможете вы подсунуть сишной функции, которая работает с данными типа FILE *, подсунуть объект плюсового потока.
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
03.02.2011, 21:02  [ТС]     много вопросов о вводе-выводе #18
#include <stdio.h>
FILE *freopen(const char *fname, const char *mode, FILE *stream);

Функция freopen() связывает существующий поток с другим файлом. Имя нового файла задается параметром fname, режим доступа — параметром mode, a переназначаемый поток определяется указателем stream. Возможные значения строки mode — те же, что и для функции fopen() (полное их описание можно найти в разделе, посвященном описанию fopen).
я и пытался поток с файлом связать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Пример
 
Приведенная здесь программа использует функцию freopen(), чтобы перенаправить поток stdout 
в файл с названием OUT. Первое сообщение программы выводится на экран, а второе, 
перенаправленное, записывается функцией freopen(), в файл на диске.
 
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
  FILE *fp;
 
  printf("Это сообщение появится на экране.\n");
 
  if((fp=freopen("OUT", "w" ,stdout))==NULL) {
    printf("Не удается открыть файл.\n");
    exit(1);
  }
 
  printf("Это сообщение будет записано в файл OUT.");
 
  fclose(fp);
 
  return 0;
}
Добавлено через 3 минуты
http://www.cplusplus.com/reference/c...stdio/freopen/
по-моему функция работает именно как я и хотел...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
03.02.2011, 21:20     много вопросов о вводе-выводе #19
AC-93, вы понимаете, что у Си-функций printf/scanf и Си++-объектов std::cin и std::cout разные потоки?

Добавлено через 4 минуты
Хотя нет, поток-то один, stdin/stdout, так что в принципе можно перенаправить поток в файл.

Добавлено через 7 минут
Кстати, а чем вас такой вариант не устраивает?

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <fstream>
 
int main()
{
    std::ifstream fin("input.txt");
    std::ofstream fout("output.txt");
 
    fout << "Hello, World!" << std::endl;
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2011, 21:25     много вопросов о вводе-выводе
Еще ссылки по теме:

Ошибка в вводе/выводе массива C++
Русский язык в вводе/выводе C++
Кирилица отображается нормально при выводе из программы, но иероглифы при вводе в консоль C++

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

Или воспользуйтесь поиском по форуму:
AC-93
13 / 13 / 0
Регистрация: 27.01.2010
Сообщений: 150
03.02.2011, 21:25  [ТС]     много вопросов о вводе-выводе #20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <stdio.h>
#include <fstream> 
 
 
using namespace std;
int main()
{   int a; 
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin>>a; 
    
    cout<<a;
    return(0);
}
так работает. Все-таки поток называется cin cout ? или in и out , зачем тогда пишется c?
например когда я объявлял поток
ifstream in; in.open("input.txt"); то поток обращался через in>>f; без лишних букв c.

Далее если я прописал using namespace std; я все равно должен прописывать std перед in и out , вроде же нет...
Простите что утомил... но...

Добавлено через 3 минуты
такой вариант не устраивает тем, что привык в делфи иметь возможность быстро переключаться с клавы-монтор на инпут-оутпут файл(закоментил строчку перенаправления файла в стандартный поток и все), а тут придется переписывать все команды.
Yandex
Объявления
03.02.2011, 21:25     много вопросов о вводе-выводе
Ответ Создать тему
Опции темы

Текущее время: 10:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru