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

Работа с файлами (С) - C++

Восстановить пароль Регистрация
 
neon902
1 / 1 / 0
Регистрация: 01.07.2010
Сообщений: 62
01.07.2010, 15:17     Работа с файлами (С) #1
Подскажите как работать с файлами в С. Чтение файла, запись в файл, вывод содержимого файла на экран. Желательно на примерах). Зарание спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2010, 15:17     Работа с файлами (С)
Посмотрите здесь:

C++ Работа с файлами
Работа с файлами в C++ C++
Работа с файлами C++
C++ Работа с файлами
C++ Работа с файлами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.07.2010, 15:59     Работа с файлами (С) #2
Чтение:

fgets() - Читает до символа конца строки
C
1
2
3
4
5
6
7
include <stdio.h>
               FILE *stream;
               char line[100], *result;
               /* следующий оператор выбирает строку  символов  из  потока
         stream. Может быть считано не более 99 символов  либо все символы
         до символа новой строки '\n', включая и его. */
               result = fgets(line, 100, stream);.
fscanf() - До пробела
Пример:

C
1
2
3
4
5
6
while (fscanf(f,"%s",Sn)!=EOF)
        {
            fscanf(f,"%s",Se);
            list*h2=form(Sn,Se);
            ins(h,e,h2,k);
        }
Запись: fputs() - Функция fputs() записывает в заданный поток stream содержимое строки, адресуемой указателем str. При этом завершающий нулевой символ (т.е. символ конца строки ('0')) не записывается.

C
1
2
3
4
5
Пример
 
Приведенный фрагмент программы записывает в поток, связанный с файлом fp, строку это тест.
 
fputs("'это тест", fp);
fprintf() - Функция fprintf() выводит в лоток, адресуемый параметром stream, значения аргументов, составляющих список аргументов, в соответствии с заданной строкой формата format. Возвращаемое значение равно количеству реально выведенных символов. Если при выводе возникла ошибка, возвращается отрицательное число.

Пример:

C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
int main(void)
{   
FILE *fp;        
if((fp=fopen("test", "wb")) == NULL)    
{      printf("Не удаётся открыть файл.\n");      
exit(1);   
}   
fprintf(fp, "это тест %d %f", 28, 04.06);   fclose(fp);return 0;}

Вывод содержимого: Не помню точно
neon902
1 / 1 / 0
Регистрация: 01.07.2010
Сообщений: 62
01.07.2010, 16:25  [ТС]     Работа с файлами (С) #3
Можешь пояснить
fscanf(f,"%s",Se);
list*h2=form(Sn,Se);
ins(h,e,h2,k);
что такое Sn,Se и ins(h,e,h2,k)?

fprintf(fp, "это тест %d %f", 28, 04.06) что это за цифры 28, 04.06?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.07.2010, 16:29     Работа с файлами (С) #4
Цитата Сообщение от neon902 Посмотреть сообщение
Можешь пояснить
fscanf(f,"%s",Se);
list*h2=form(Sn,Se);
ins(h,e,h2,k);
что такое Sn,Se и ins(h,e,h2,k)?

fprintf(fp, "это тест %d %f", 28, 04.06) что это за цифры 28, 04.06?
Могу. Это пример из моей программы. Так что, что это такое это абсолютно не суть) Вопросы таки были про fscanf.
П.С. Sn, Se -массивы типа char

fprintf. Полагаю рандомные. Прототип fprintf -

fprintf(f, "%s", str)

Где f - файл, %s - формат вывода, str собственно сама строка. П.С. это естественно для строки. Для других типов меняем %s на нужное)
neon902
1 / 1 / 0
Регистрация: 01.07.2010
Сообщений: 62
01.07.2010, 16:36  [ТС]     Работа с файлами (С) #5
Я что-то туплю, всё равно не допонял, давай на моей задачке, мне нужно из файла считать несколько двухмерных матриц и работать с ними. как это примерно будит выглядить?
Просто я не понимаю как работать отдельно с элементами матриц, если считываешь их полность или построчно.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.07.2010, 17:33     Работа с файлами (С) #6
Цитата Сообщение от Lavroff Посмотреть сообщение
fscanf() - До пробела
fscanf() чего только не читает...
C
1
2
3
char buf[BUFSIZ];
...
fscanf(file, "%[^\n]%*c", buf);
Читает файл построчно, при чём символ \n в буфер не заносится
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.07.2010, 17:37     Работа с файлами (С) #7
Цитата Сообщение от neon902 Посмотреть сообщение
Я что-то туплю, всё равно не допонял, давай на моей задачке, мне нужно из файла считать несколько двухмерных матриц и работать с ними. как это примерно будит выглядить?
Просто я не понимаю как работать отдельно с элементами матриц, если считываешь их полность или построчно.
Как матрица в файле расположена?

C
1
2
3
4
while(fscanf(f, "%d", a[i])!=EOF)
{
бла бла бла
}
Не уверен. Даже не знаю будет ли такое пахать
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.07.2010, 17:45     Работа с файлами (С) #8
Цитата Сообщение от Lavroff Посмотреть сообщение
Даже не знаю будет ли такое пахать
Не будет.
C
1
2
3
...
while( fscanf(f, "%d", &a[i]) == 1 )
...
Цитата Сообщение от neon902 Посмотреть сообщение
мне нужно из файла считать несколько двухмерных матриц и работать с ними.
Сильно зависит от того, в каком виде матрицы в файле хранятся. Из вариантов:
1. в первой строке два числа - количество строк и столбцов, дальше подряд в строку все значения
2. в первой строке - количество строк, во второй столбцов, дальше в каждой строке по элементу
3. матрица записана в файл "как есть" - то есть типа
5 8 6 1 6 3
4 5 1 3 5 7
8 0 2 4 3 5

И ещё можно кучу разных способов придумать. С этим определитесь как-нибудь, а дальше видно будет...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.07.2010, 17:47     Работа с файлами (С) #9
easybudda, Да уж. Про & я весело забыл) Да и про EOF что-то тоже зря написал
neon902
1 / 1 / 0
Регистрация: 01.07.2010
Сообщений: 62
01.07.2010, 18:06  [ТС]     Работа с файлами (С) #10
Ну лучше матрицу записывать так:
5 8 6 1 6 3
4 5 1 3 5 7
8 0 2 4 3 5
как при таком записи считать эту матрицу?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.07.2010, 18:07     Работа с файлами (С) #11
fscanf видимо
neon902
1 / 1 / 0
Регистрация: 01.07.2010
Сообщений: 62
01.07.2010, 18:10  [ТС]     Работа с файлами (С) #12
Ну это я уже понял)) а какой примерный код будит? можете написать
МаксимМВ
C/C++
90 / 90 / 5
Регистрация: 01.07.2010
Сообщений: 281
02.07.2010, 10:22     Работа с файлами (С) #13
а перевод строки как сделать??
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
02.07.2010, 12:55     Работа с файлами (С) #14
Цитата Сообщение от easybudda Посмотреть сообщение
char buf[BUFSIZ];
...
fscanf(file, "%[^\n]%*c", buf);
Читает файл построчно, при чём символ \n в буфер не заносится
объясните пожалуйста вот это "%[^\n]%*c"
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.07.2010, 09:50     Работа с файлами (С) #15
Цитата Сообщение от neon902
Ну лучше матрицу записывать так:
5 8 6 1 6 3
4 5 1 3 5 7
8 0 2 4 3 5
как при таком записи считать эту матрицу?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    int arr[3][6] = { 0 };
    int i;
 
    i = 0;
    while
    (
        fscanf(
            ifp,
            "%d %d %d %d %d %d",
            arr[i][0],
            arr[i][1],
            arr[i][2],
            arr[i][3],
            arr[i][4],
            arr[i][5]
        ) == 6 && i < 3
    )
        i++;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2010, 13:47     Работа с файлами (С)
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.07.2010, 13:47     Работа с файлами (С) #16
Цитата Сообщение от Egeni Посмотреть сообщение
объясните пожалуйста вот это "%[^\n]%*c"
А в справочнике описание функции scanf() посмотреть - не?
Г. Шилдт "Послный справочник по С"
Использование набора сканируемых символов

Функция scanf() поддерживает спецификатор формата общего назначения, называемый набором сканируемых символов (scanset). Набор сканируемых символов представляет собой множество символов. Когда scanf() обрабатывает такое множество, то вводит только те символы, которые входят в набор сканируемых символов. Читаемые символы будут помещаться в массив символов, который указан аргументом, соответствующим набору сканируемых символов. Этот набор определяется следующим образом: все те символы, которые предстоит сканировать, помещают в квадратные скобки. Непосредственно перед открывающей квадратной скобкой должен находиться знак %. Например, следующий набор сканируемых символов дает указание scanf() сканировать только символы X, Y и Z:

%[XYZ]

При использовании набора сканируемых символов функция scanf() продолжает читать символы, помещая их в соответствующий массив символов, пока не встретится символ, не входящий в этот набор. При возвращении из scanf() в массиве символов будет находиться строка, состоящая из считанных символов, причем эта строка будет заканчиваться символом конца строки. Чтобы увидеть, как это все работает, запустите следующую программу:

C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void)
{
  int i;
  char str[80], str2[80];
 
  scanf("%d%[abcdefg]%s", &i, str, str2);
  printf("%d %s %s", i, str, str2);
 
  return 0;
}
Введите 123abcdtye, а затем нажмите клавишу <ENTER>. После этого программа выведет 123 abed tye. Так как в данном случае 't' не входит в набор сканируемых символов, то scanf() прекратила чтение символов в переменную str сразу после того, как встретился символ 't'. Оставшиеся символы были помещены в переменную str2.

Кроме того, можно указать набор сканируемых символов, работающий с точностью до наоборот; тогда первым символом в таком наборе должен быть ^. Этот символ дает указание scanf() принимать любой символ, который не входит в набор сканируемых символов.

В большинстве реализаций для указания диапазона можно использовать дефис. Например, указанный ниже набор сканируемых символов дает функции scanf() указание принимать символы от А до Z:

%[A-Z]

Следует обратить внимание на такой важный момент: набор сканируемых символов чувствителен к регистру букв. Если нужно сканировать буквы и на верхнем, и на нижнем регистре, то их надо указывать отдельно для каждого регистра.


Подавление ввода

scanf() может прочитать поле, но не присваивать прочитанное значение никакой переменной; для этого надо перед литерой-спецификатором формата поля поставить звездочку, *. Например, когда выполняется оператор

scanf("%d%*c%d", &x, &y);

можно ввести пару координат 10,10. Запятая будет прочитана правильно, но ничему не будет присвоена. Подавление присвоения особенно полезно тогда, когда нужно обработать только часть того, что вводится.
Yandex
Объявления
03.07.2010, 13:47     Работа с файлами (С)
Ответ Создать тему
Опции темы

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