Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2010, 10:05   #1
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию Си в Юниксе. Работа с файлом

Работаю в Linux (если это имеет значение). Закодил простую прогу на Си записи в файл указанной строчки. Прога работает, строчка всегда записывается, но всегда выдается ошибка о закрытии файла. Хелп!

Код:
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
	int fd;
	size_t size;
	int result;
	if((fd = open("file1.c", O_WRONLY | O_CREAT, 0666)) == -1){
	    printf("Ne otkril\n");
	    return 0;
	}	    
	size = write(fd, "Hello, world!" , 13);
	result = close(fd);
	if(result = -1){
	    printf("Ne zakril\n");
	    perror("oO:\n");
	    return 0;
	}
	
	return 0;
}
Shit happens
IceBreaker вне форума Ответить с цитированием
Старый 10.02.2010, 10:41   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

А почему нельзя использовать функции fopen и fclose?
Код:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  FILE *fp;
  char str[128];

  if ((fp = fopen(argv[1], "r")) == NULL)
  {
     printf("Can not open file.\n");
     exit(1);
  }

  while (!eof(fp))
  {
     if fgets(str, 126, fp)) printf("%s", str);
  }

  fclose(fp);
  return 0;
}
взято из справочника
psycho-coder вне форума Ответить с цитированием
Старый 10.02.2010, 16:05   #3
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию

Спасибо за комментарий!
Ответ: Потому, что я работаю в Юниксе и мне нужно использовать одинаковые функции работы с потоками ввода-вывода, а, как известно, файл это поток информации, как и Pipe и Fifo.

Самое прикольное. что при вызове perror Он выдает Succes, что вообще не понятно, потому, что result возвращает -1, т.е. операция закрытия не удалась.
Shit happens
IceBreaker вне форума Ответить с цитированием
Старый 10.02.2010, 16:26   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Это из MINIX III, но по стандарту POSIX
Цитата:
+++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++ ++++++++++
include/errno.h
+++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++ ++++++++++
00200 /* В заголовочном файле <errno.h> определены коды различных ошибок, которые могут
00201 * возникать при исполнении программ. Они видимы для программ пользователя и должны
00202 * представлять собой небольшие положительные целые числа. Тем не менее, они также
00203 * используются и внутри MINIX, где они должны быть отрицательными. Например, системный
00204 * вызов READ исполняется внутренне путем обращения к do_read().Эта функция
00205 * возвращает либо положительное число считанных байтов, либо отрицательный код ошибки.
00206 *
00207 * Чтобы разрешить проблему кодов ошибок, которые должны быть отрицательными внутри
00208 * системы и положительными вне ее, используется следующий механизм.
00209 * Все определения имеют вид
00210 *
00211 * #define EPERM (_SIGN 1)
00212 *

00213 * Если макрос _SYSTEM определен, то _SIGN задается равным "-", в противном случае он
00214 * задается равным "". Таким образом, при компиляции операционной системы макрос
00215 * _SYSTEM будет определен и EPERM получит значение (- 1), а при включении этого
00216 * файла в обычную пользовательскую программу EPERM будет равен (1).
00217 */

00218
00219 #ifndef _ERRNO_H /* проверка, не включен ли заголовок <errno.h> ранее */
00220 #define _ERRNO_H /* нет, не включен; учесть этот факт */
00221
00222 /* Определение _SIGN как "" или "-" в зависимости от _SYSTEM. */
00223 #ifdef _SYSTEM
00224 # define _SIGN -
00225 # define OK 0
00226 #else
00227 # define _SIGN
00228 #endif
00229
00230 extern int errno; /* сюда помещаются коды ошибок */
Посмотрите файл include/errno.h, там должны быть описания ошибок. Вот с помощью них и проверяйте, а не на -1))

вот часть из них
Цитата:
00231
00232 /* Численные значения кодов ошибок */
00233 #define _NERROR 70 /* количество ошибок */
00234
00235 #define EGENERIC (_SIGN 99) /* общая ошибка */
00236 #define EPERM (_SIGN 1) /* операция не разрешена */
00237 #define ENOENT (_SIGN 2) /* файл или каталог не существует */
00238 #define ESRCH (_SIGN 3) /* процесс не существует */
00239 #define EINTR (_SIGN 4) /* вызов прерванной функции */
00240 #define EIO (_SIGN 5) /* ошибка ввода-вывода */
00241 #define ENXIO (_SIGN 6) /* устройство или адрес не существует */
00242 #define E2BIG (_SIGN 7) /* слишком длинный список аргументов */
00243 #define ENOEXEC (_SIGN 8) /* ошибка формата exec */
00244 #define EBADF (_SIGN 9) /* некорректный дескриптор файла */
00245 #define ECHILD (_SIGN 10) /* процесс-потомок отсутствует */
00246 #define EAGAIN (_SIGN 11) /* ресурс временно недоступен */
00247 #define ENOMEM (_SIGN 12) /* недостаточно памяти */
00248 #define EACCES (_SIGN 13) /* разрешение отклонено */
00249 #define EFAULT (_SIGN 14) /* некорректный адрес */
00250 #define ENOTBLK (_SIGN 15) /* расширение: не блочный специальный файл */
00251 #define EBUSY (_SIGN 16) /* ресурс занят */
00252 #define EEXIST (_SIGN 17) /* файл существует */
00253 #define EXDEV (_SIGN 18) /* некорректная связь */
00254 #define ENODEV (_SIGN 19) /* устройство не существует */
00255 #define ENOTDIR (_SIGN 20) /* не является каталогом */
00256 #define EISDIR (_SIGN 21) /* является каталогом */
00257 #define EINVAL (_SIGN 22) /* некорректный аргумент */
00258 #define ENFILE (_SIGN 23) /* в системе слишком много открытых файлов */
00259 #define EMFILE (_SIGN 24) /* слишком много открытых файлов */
00260 #define ENOTTY (_SIGN 25) /* некорректная операция управления вводом-выводом */
00261 #define ETXTBSY (_SIGN 26) /* больше не используется */
00262 #define EFBIG (_SIGN 27) /* файл слишком велик */
00263 #define ENOSPC (_SIGN 28) /* на устройстве не осталось свободного места */
00264 #define ESPIPE (_SIGN 29) /* некорректная операция seek */
00265 #define EROFS (_SIGN 30) /* файловая система только для чтения */
00266 #define EMLINK (_SIGN 31) /* слишком много связей */
00267 #define EPIPE (_SIGN 32) /* канал разорван */
00268 #define EDOM (_SIGN 33) /* ошибка домена (из стандарта ANSI C) */
psycho-coder вне форума Ответить с цитированием
Старый 10.02.2010, 16:34   #5
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию

супер!! Спасибо за идею!

Но теперь возникло еще вопрос: а нах? если мне он выдает значение succes, прокомпильте прогу - видно будет.
Shit happens

Последний раз редактировалось IceBreaker; 10.02.2010 в 16:38.
IceBreaker вне форума Ответить с цитированием
Старый 10.02.2010, 17:01   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Я думаю, что если выдает succes, значит не верно сравниваете с кодом ошибки. Возможно программа работает правильно.

Скомпилить не могу, я под виндой щас сижу.
psycho-coder вне форума Ответить с цитированием
Старый 10.02.2010, 18:11   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Код:
	if(result = -1){
	    printf("Ne zakril\n");
	    perror("oO:\n");
	    return 0;
	}
Ничего подозрительного не замечаете?
Стоит исправить на
Код:
 if(result == -1) {
и тогда никаких сообщений об ошибках )
netrino вне форума Ответить с цитированием
Старый 10.02.2010, 19:37   #8
IceBreaker
Пользователь
 
Аватар для IceBreaker
 
Регистрация: 03.02.2010
Сообщений: 20
По умолчанию

ааааааа, семен семеныч!!! спасибо большое)))
Shit happens
IceBreaker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлом SVadiks Помощь студентам 3 08.12.2009 17:46
работа с файлом Cpluser Общие вопросы .NET 3 22.11.2009 22:45
Работа с файлом ! PPikaso Помощь студентам 3 29.10.2009 14:21
Работа с файлом D_E_N Общие вопросы Delphi 6 17.07.2009 14:03
С++ работа с файлом. НедоВовик Помощь студентам 1 05.07.2009 18:22