Работа с файлами в C (Туплю...)

Модератор: Модераторы разделов

_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Работа с файлами в C

Сообщение _Gleb_ »

Из языков программирования имел дело только с Бейсиком и Паскалем. На последнем и писал большинство программок по учёбе. Тут возникла необходимость освоить C и написать программку. Стал пытаться освоить язык по книге Кернигана и Ритчи, но никак не могу понять принципы работы с файлами.
Во-первых, смущает отсутствие строковых переменных. Если их нет, то как определяется название файла? Это касается не только функции fopen, но и других функций, использующих, то, что в Паскале называлось "string". Например, printf.
Объясните, кто-нибудь, человеку доступно: как осуществляется открытие файла для записи -- не пойму, какую роль в этом деле играют указатели; и перебитие отдельных, необходимых мне, символов в файле. Больше мне, собственно, ничего в этом деле не нужно. Не могу мозг перестроить...
Изображение
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Работа с файлами в C

Сообщение Uncle_Theodore »

_Gleb_ писал(а):
28.07.2007 18:30
Из языков программирования имел дело только с Бейсиком и Паскалем. На последнем и писал большинство программок по учёбе. Тут возникла необходимость освоить C и написать программку. Стал пытаться освоить язык по книге Кернигана и Ритчи, но никак не могу понять принципы работы с файлами.
Во-первых, смущает отсутствие строковых переменных. Если их нет, то как определяется название файла?

Почему нет? Очень даже есть. В Сях строка -- это массив символов. fopen требует ссылку на константный массив символов в качестве имени файла. То есть, можно прямо имя файла и указать.
Это касается не только функции fopen, но и других функций, использующих, то, что в Паскале называлось "string". Например, printf.
Объясните, кто-нибудь, человеку доступно: как осуществляется открытие файла для записи -- не пойму, какую роль в этом деле играют указатели; и перебитие отдельных, необходимых мне, символов в файле. Больше мне, собственно, ничего в этом деле не нужно. Не могу мозг перестроить...

Так, вроде, в man fopen все написано.
fopen возвращает указатель на переменную типа FILE.

FILE *fptr;
fprt = fopen("myfile", "r");

Я, кстати, предпочитаю пользовать open(), а не fopen()...

PS Вот примерчик с fopen'ом
http://luv.asn.au/overheads/prog/gdb_example.html
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Работа с файлами в C

Сообщение _Gleb_ »

А если мне нужно переписать N-ый байт в файле на символ "A", то это будет что-то вроде:

Код: Выделить всё

  for (i  = 1; i < N-1; i++)
    с=getc(myfile);
putc ("A",myfile);

и короче никак? Без считывания предидущих байтов не обойтись? А как потом подвинуть указатель байта назад?
Изображение
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Работа с файлами в C

Сообщение Uncle_Theodore »

_Gleb_ писал(а):
18.08.2007 23:30
А если мне нужно переписать N-ый байт в файле на символ "A", то это будет что-то вроде:

Код: Выделить всё

  for (i  = 1; i < N-1; i++)
    с=getc(myfile);
putc ("A",myfile);

и короче никак? Без считывания предидущих байтов не обойтись? А как потом подвинуть указатель байта назад?

man lseek
?
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Работа с файлами в C

Сообщение _Gleb_ »

Uncle_Theodore писал(а):
18.08.2007 23:35
man lseek
?

Спасибо! Только не понял: а откуда она знает, о каком файле идёт речь?
Изображение
Спасибо сказали:
Аватара пользователя
slasher
Сообщения: 92
ОС: Arch

Re: Работа с файлами в C

Сообщение slasher »

repositions the offset of the open file associated with the file descriptor fildes
то есть первый аргумент -- это идентификатор открытого файла
Today would be a good day to DIE.
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Работа с файлами в C

Сообщение _Gleb_ »

slasher писал(а):
18.08.2007 23:54
то есть первый аргумент -- это идентификатор открытого файла

А что за идентификатор? Откуда его брать? Почему он имеет тип int?
Изображение
Спасибо сказали:
Аватара пользователя
slasher
Сообщения: 92
ОС: Arch

Re: Работа с файлами в C

Сообщение slasher »

Идентификатор (дескриптор) возвращается функцией (системным вызовом) open(). Если Вы пользуетесь fopen(), то Вам нужен соответственно fseek(), которому передается указатель на
FILE
Today would be a good day to DIE.
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Работа с файлами в C

Сообщение _Gleb_ »

Да, спасибо, это будет лучше: дополнительной библиотеки, подключать не надо...
Изображение
Спасибо сказали: