Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/10: Рейтинг темы: голосов - 10, средняя оценка - 4.60
AC-93
16 / 16 / 1
Регистрация: 27.01.2010
Сообщений: 150
1

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

03.02.2011, 09:54. Просмотров 1778. Ответов 25
Метки нет (Все метки)

Здравствуйте, законченный дельфист решил переехать... вопросов куча, просьба ответить.
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; не работает.
топик будет дополняться) спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2011, 09:54
Ответы с готовыми решениями:

Много вопросов
ребят подскажите как зделать Panel прозрачной а текст который в ней есть...

Ошибка в вводе/выводе массива
При выводе элемента массива всегда значение ноль. Вероятно ввожу массив...

Русский язык в вводе/выводе
с помощью функции setlocale(0, &quot;rus&quot;); Программа понимает русский язык, который...

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

При выводе двумерного символьного массива много непонятного мусора, либо непонятные символы
Хочу разбить строку на слова, которые запишу в отдельный массив, чтобы было...

25
dampir_sanek
151 / 149 / 44
Регистрация: 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);
1
Escapable
54 / 54 / 9
Регистрация: 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
1
dampir_sanek
151 / 149 / 44
Регистрация: 09.02.2010
Сообщений: 407
03.02.2011, 13:27 4
6 вопрос:
%d -подстановка в это место значения типа int, которая указана после запятой.

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

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

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

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

Не по теме:

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

0
dampir_sanek
151 / 149 / 44
Регистрация: 09.02.2010
Сообщений: 407
03.02.2011, 14:08 6
silent_1991, да Вы конечно правы. Я имел ввиду это в контексте операторов cout, cin. А так дельное замечание.
0
Mogul-kan
23 / 23 / 9
Регистрация: 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-относится только к первому(поэтому нужно ставить для каждой переменной)
1
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
03.02.2011, 14:29 8
Цитата Сообщение от Mogul-kan Посмотреть сообщение
амперсанд &-содержит адрес ячейки
Амперсанд ничего содержать не может, это оператор. Он возвращает адрес ячейки памяти своего операнда.

Не по теме:

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

1
AC-93
16 / 16 / 1
Регистрация: 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 вопрос не понял

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

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

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

Добавлено через 1 минуту
Отлично, freopen понял, то что надо.
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
03.02.2011, 20:11 14
Цитата Сообщение от AC-93 Посмотреть сообщение
Пошел переписывать все функции делфи в сишку
Это я вам как вариант предложил. Второй вариант - учите Си++, там поудобнее работа с потоками, тоже никаких "дополнительных символов".
0
AC-93
16 / 16 / 1
Регистрация: 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 минуту
и кстати как комментировать код не по строчкам? Чтобы блоком целым.
конечно я буду учить С++) Тем более потоки довольно красивые.
0
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
03.02.2011, 20:27 16
Цитата Сообщение от AC-93 Посмотреть сообщение
и кстати как комментировать код не по строчкам? Чтобы блоком целым.
C++
1
2
/*some 
code*/
1
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
03.02.2011, 20:54 17
AC-93, блин. Ну сказал же ясно, не мешать Си и Си++ потоки. А вы это умудрились не в пределах программы сделать, а в пределах операции. Не сможете вы подсунуть сишной функции, которая работает с данными типа FILE *, подсунуть объект плюсового потока.
0
AC-93
16 / 16 / 1
Регистрация: 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/clibrary/cstdio/freopen/
по-моему функция работает именно как я и хотел...
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 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;
}
0
AC-93
16 / 16 / 1
Регистрация: 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 минуты
такой вариант не устраивает тем, что привык в делфи иметь возможность быстро переключаться с клавы-монтор на инпут-оутпут файл(закоментил строчку перенаправления файла в стандартный поток и все), а тут придется переписывать все команды.
0
03.02.2011, 21:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2011, 21:25

Кирилица отображается нормально при выводе из программы, но иероглифы при вводе в консоль
Что надо подключить что бы в консоли писать русскими буквами? cin &gt;&gt; kol;...

Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл?
void mainmenu() { cout &lt;&lt; &quot;Введи число&quot; &lt;&lt; endl; cin &gt;&gt; choice; if (choice...

Составить программу, которая при вводе символа с клавиатуры выво-дит "латинская буква" при вводе латинской буквы и "не латинская бук-ва" во всех остал
Составить программу, которая при вводе символа с клавиатуры выво-дит...


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

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

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