2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Язык си
Сообщение14.11.2015, 12:38 


25/10/15
20
Всем доброго времени суток! У меня вопросы по программированию на си) Что означает запись fscanf(In, "%lf", &a)<=0.
Разве эта функция может принимать какие-либо значения?
Ещё один вопрос: правильно ли я понимаю, что In в данном случае указатель на файл? Как понять запись In=fopen("адрес файла", "r") вроде все понятно, но как одна переменная может служить указателем на целый файл?



Только новичёк, пытаюсь разобрать со структурой программ)

-- 14.11.2015, 13:36 --

код: [ скачать ] [ спрятать ]
Используется синтаксис C
Int task(into a, int b);
Int main ()
{
Int a=..., b=...;
FILE *In;

...
In=fopen("...", "r");
task(a, b);
...
}
task ( int a, int b)
{
Int G;
...
fscanf(In, "%d", &G);
.....
}

 Профиль  
                  
 
 Re: Язык си
Сообщение14.11.2015, 13:40 


25/10/15
20
Будет ли функция task считывать данные из файла, если я не открываю файл в этой функции, а открываю только в мейне, но перед вызовом функции?

 Профиль  
                  
 
 Re: Язык си
Сообщение14.11.2015, 13:53 
Заслуженный участник
Аватара пользователя


01/09/13
4318
Bellesimmo в сообщении #1073272 писал(а):
как одна переменная может служить указателем на целый файл

Посмотрите описание структуры, ссылка на которую возвращается.

Bellesimmo в сообщении #1073272 писал(а):
Разве эта функция может принимать какие-либо значения?

Видимо имелось ввиду "возвращать"? А почему нет? http://www.cplusplus.com/reference/cstdio/fscanf/ например.

 Профиль  
                  
 
 Re: Язык си
Сообщение14.11.2015, 14:14 
Заслуженный участник


09/05/12
25179
Bellesimmo в сообщении #1073272 писал(а):
Всем доброго времени суток! У меня вопросы по программированию на си) Что означает запись fscanf(In, "%lf", &a)<=0.
Разве эта функция может принимать какие-либо значения?
Все основные функции ввода/вывода в C возвращают значение типа int. В частности, fscanf() возвращает количество успешно прочитанных форматных полей, поэтому данное условие будет выполнено, если чтение почему-то не удалось (файл кончился и т.д.).
Bellesimmo в сообщении #1073272 писал(а):
Ещё один вопрос: правильно ли я понимаю, что In в данном случае указатель на файл?
Правильно.
Bellesimmo в сообщении #1073272 писал(а):
Как понять запись In=fopen("адрес файла", "r") вроде все понятно, но как одна переменная может служить указателем на целый файл?
А почему бы и нет? То, что номер дома на улице является идентификатором целого дома со всем, что в нем находится, Вас не удивляет? :wink:
Bellesimmo в сообщении #1073272 писал(а):
Только новичёк, пытаюсь разобрать со структурой программ)
Только в дальнейшем, пожалуйста, однострочные участки кода заключайте по крайней мере в теги [tt], а для многострочных (или нетривиальных однострочных) используйте "подсветку синтаксиса", выбрав там соответствующий язык.
Bellesimmo в сообщении #1073299 писал(а):
Будет ли функция task считывать данные из файла, если я не открываю файл в этой функции, а открываю только в мейне, но перед вызовом функции?
Нет. Переменные, объявленные внутри одной функции, не видны из другой. Поэтому, если подобное требуется, вынесите FILE *In; из функции main().

 Профиль  
                  
 
 Re: Язык си
Сообщение14.11.2015, 15:26 
Аватара пользователя


07/02/12
1403
Питер
Pphantom в сообщении #1073316 писал(а):
Bellesimmo в сообщении #1073299 писал(а):
Будет ли функция task считывать данные из файла, если я не открываю файл в этой функции, а открываю только в мейне, но перед вызовом функции?
Нет. Переменные, объявленные внутри одной функции, не видны из другой. Поэтому, если подобное требуется, вынесите FILE *In; из функции main().

Вот этого я бы однозначно посоветовал не делать. Порочную практику использовать глобальные переменные не стоит прививать вообще, что бы потом легче было осваивать структурное программирование. Лучше передайте переменную FILE *In; параметром в функцию, где она нужна

 Профиль  
                  
 
 Re: Язык си
Сообщение14.11.2015, 15:30 
Заслуженный участник


09/05/12
25179
bondkim137 в сообщении #1073352 писал(а):
Вот этого я бы однозначно посоветовал не делать. Порочную практику использовать глобальные переменные не стоит прививать вообще, что бы потом легче было осваивать структурное программирование. Лучше передайте переменную FILE *In; параметром в функцию, где она нужна
Соглашусь, хотя в данный момент это самый простой способ сделать код работающим. :D

 Профиль  
                  
 
 Re: Язык си
Сообщение14.11.2015, 15:57 
Аватара пользователя


07/02/12
1403
Питер
Pphantom в сообщении #1073354 писал(а):
в данный момент это самый простой способ сделать код работающим. :D

Вот именно! Жадный принцип при исправлении ошибок в коде как раз и является основной причиной его загрязнения :D

 Профиль  
                  
 
 Re: Язык си
Сообщение14.11.2015, 16:25 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Bellesimmo в сообщении #1073272 писал(а):
Ещё один вопрос: правильно ли я понимаю, что In в данном случае указатель на файл? Как понять запись In=fopen("адрес файла", "r") вроде все понятно, но как одна переменная может служить указателем на целый файл?

Правильно, пеерменная не может быть указателем на целый файл, но не потому, что файл большой, а потому, что файл вообще не находится в оперативной памяти, и на него не бывает указателей. Файл находится во внешней памяти. А тип переменной
    FILE *In;
означает кое-что другое: специальную структуру в памяти, предназначенную для управления файлом и операциями ввода-вывода. Эта структура - это описание того, "как добраться" к файлу. (Она называется "поток ввода-вывода", а на Си пишется по традиционным причинам FILE *.) Вам внутренности этой структуры совершенно не нужны, и всё, что нужно - это только правильно давать указатель на эту структуру, когда нужно. Всё остальное будет использовать та функция, которую вы вызываете. Вам нужно соблюдать определённую схему действий с этой структурой:
    Используется синтаксис C
    FILE *f;        /* завести у себя переменную на каждый используемый файл */

    f=fopen(...);   /* открыть файл */

    fscanf(f, ...); /* читать из открытого файла */
    /* или */
    fprintf(f,...); /* писать в открытый файл */

    fclose (f);     /* по окончании работы закрыть файл */
Эта структура указывает не только на файл, но и на конкретное место в нём, текущую точку чтения-записи. По мере чтения или записи эта точка сдвигается. Есть и другие действия, которые можно делать с этой структурой, но на начальном уровне их лучше пока не трогать.

 Профиль  
                  
 
 Re: Язык си
Сообщение14.11.2015, 21:43 
Аватара пользователя


07/02/12
1403
Питер
Munin в сообщении #1073383 писал(а):
Эта структура указывает не только на файл, но и на конкретное место в нём, текущую точку чтения-записи. По мере чтения или записи эта точка сдвигается. Есть и другие действия, которые можно делать с этой структурой, но на начальном уровне их лучше пока не трогать.

Я вот вообще не очень понимаю, зачем это какая-то структура, а не просто абстрактный дескриптор. И так полагаю, что работать с ее полями явно, мягко говоря, не приветсвуется. FILE * разумен только как типизатор и то с натяжкой (если речь идет об Ansi-C).

 Профиль  
                  
 
 Re: Язык си
Сообщение15.11.2015, 00:56 


25/10/15
20
Спасибо огромное всем за ответы!!!!!!! Теперь всё стало понятно) :D

 Профиль  
                  
 
 Re: Язык си
Сообщение15.11.2015, 15:11 


11/12/14
893
bondkim137 в сообщении #1073469 писал(а):
Я вот вообще не очень понимаю, зачем это какая-то структура, а не просто абстрактный дескриптор.


Мне кажется потому что кое где так и было, например в DOS были FCB - File Control Block. Там еще при старте системы конфигурировалось сколько одновременно может быть открытых FCB в системе максимально. Однако Unix, откуда Си, сам по себе сразу имел числовые хендлы, но мне кажется всё таки оглядываясь на остальные системы оставил FILE * как универсальный стандарт для POSIX.

 Профиль  
                  
 
 Re: Язык си
Сообщение15.11.2015, 16:18 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Изображение

Интересно, когда-нибудь войдёт в моду сначала читать, потом писать?

В стандартной библиотеке Си, как и в POSIX, имеется полный набор для работы как через числовые "абстрактные" дескрипторы (без префикса f - open), так и через структуру FILE * (с префиксом f - fopen). Структура эта имеет вполне читаемые и даже записываемые поля для пользователя, и только для начинающих неумелых пользователей висит табличка "Не влезай - убьёт!". Некоторая специфика добавляется тем, что эти структуры не создаются самим пользователем, а выделяются системой в каком-то системном месте, и указатели по сути не динамические.

 Профиль  
                  
 
 Re: Язык си
Сообщение15.11.2015, 17:49 
Аватара пользователя


07/02/12
1403
Питер
Munin в сообщении #1073718 писал(а):
и только для начинающих неумелых пользователей висит табличка "Не влезай - убьёт!"

а что пишут на тему многопоточной работы функций, начинающихся на f, особенно в контексте самостоятельного доступа (особенно записи) к полям структуры FILE?

 Профиль  
                  
 
 Re: Язык си
Сообщение15.11.2015, 17:59 


11/12/14
893
bondkim137 в сообщении #1073745 писал(а):
а что пишут на тему многопоточной работы функций, начинающихся на f, особенно в контексте самостоятельного доступа (особенно записи) к полям структуры FILE?


Так и пишут - НЕЛЬЗЯ!!!

 Профиль  
                  
 
 Re: Язык си
Сообщение15.11.2015, 18:15 
Аватара пользователя


07/02/12
1403
Питер
aa_dav в сообщении #1073749 писал(а):
Так и пишут - НЕЛЬЗЯ!!!

вообще fxxxx нельзя или к полям FILE самому обращаться нельзя?

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

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



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

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


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

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