Перейти к содержимому

Как считать из файла c

  • автор:

Как считать из файла c

При работе с текстовыми файлами граздо проще работать с данными не как с отдельными символами, а как со строками с помощью функций fgets() и fputs() .

Запись текстового файла

Функция fputs() записывает в файл строку, то есть набор символов, который завершается символом ‘\0’. Она имеет следующий прототип:

int fputs(const char *s, FILE *stream);

Первый параметр функции — записываемая строка, а второй — указатель на файловый поток. В качестве результата функция возвращает неотрицательное целое число. При ошибках в процессе записи возвращается значение EOF .

При записи строки нулевой символ ‘\0’ в файл не записывается.

Например, запишем строку в файл:

#include int main(void) < // строка для записи char * message = "Hello METANIT.COM!\nAn apple a day keeps the doctor away"; // файл для записи char * filename = "data.txt"; // запись в файл FILE *fp = fopen(filename, "w"); if(fp) < // записываем строку fputs(message, fp); fclose(fp); printf("File has been written\n"); >>

Запись довольно проста: открываем файл на запись и с помощью вызова fputs(message, fp) записываем в файл искомую строку.

Чтение текстового файла

Функция fgets() считывает из файла одну строку и имеет следующий прототип:

char * fgets(char *s, int n, FILE *sream);

Первый параметр char *s представляет строку, в которую производится считывание. Второй параметр — число n указывает, сколько символов необходимо считывать. И третий параметр представляет файловый поток, из которого производится считывание.

При вызове функция считывает из файла не более n-1 символов. Функция прекращает чтение, когда прочтет n-1 символов или встретит символ переноса строки \n. Все считанные символы записываются в строку s, в том числе символ \n. И также конец каждой строки дописывается нулевой символ ‘\0’.

При успешном завершении функция возвращает указатель s , а при ошибке или достижении конца файла возвращается значение NULL .

Считаем данные из выше записанного файла «data.txt»:

#include int main(void) < // файл чтения char * filename = "data.txt"; // буфер для считавания данных из файла char buffer[256]; // чтение из файла FILE *fp = fopen(filename, "r"); if(fp) < // пока не дойдем до конца, считываем по 256 байт while((fgets(buffer, 256, fp))!=NULL) < printf("%s", buffer); >fclose(fp); > >

Здеcь открываем файл на чтение и в цикле считываем из файла по 256 символов и выводим их на консоль с помощью вызова fgets(cc, 256, fp) . Когда данные в файле закончатся, функция возвратит NULL, и произойдет выход из цикла.

Копирование файлов

Другой пример работы с текстовыми файлами — копирование содержимого из одного файла в другой:

#include int main(void) < char * filename1 = "data1.txt"; char * filename2 = "data2.txt"; char buffer[256]; FILE *f1 = fopen(filename1, "r"); // файл на чтение FILE *f2 = fopen(filename2, "w"); // файл на запись if(!f1 || !f2) < printf("Error occured while opening file\n"); >else < // пока не дойдем до конца, считываем по 256 байт из файла f1 while((fgets(buffer, 256, f1))!=NULL) < // записываем строку в файл f2 fputs(buffer, f2); printf("%s", buffer); >> fclose(f1); fclose(f2); return 0; >

Использование Visual C# для чтения и записи в текстовый файл

В этой статье описано, как выполнить чтение и запись в текстовый файл с помощью Visual C#.

Оригинальная версия продукта: Visual Studio
Оригинальный номер базы знаний: 816149

Сводка

В разделе Чтение текстового файла этой статьи описывается, как использовать класс StreamReader для чтения текстового файла. В разделах Запись в текстовый файл (пример 1) и Запись в текстовый файл (пример 2) описывается, как использовать класс StreamWriter для записи текста в файл.

Чтение текстового файла

В следующем коде используется класс StreamReader для открытия, чтения и закрытия текстового файла. Можно передать путь к текстовому файлу в конструктор StreamReader для автоматического открытия файла. Метод ReadLine считывает каждую строку текста и перемещает указатель файла на следующую строку по мере чтения. Если метод ReadLine достигает конца файла, он возвращает пустую ссылку. Дополнительные сведения см. в разделе Класс StreamReader.

  1. Создайте пример текстового файла в Блокноте. Выполните приведенные ниже действия.
    1. Вставьте текст hello world в Блокнот.
    2. Сохраните файл как Sample.txt.
    using System.IO; 
    String line; try < //Pass the file path and file name to the StreamReader constructor StreamReader sr = new StreamReader("C:\\Sample.txt"); //Read the first line of text line = sr.ReadLine(); //Continue to read until you reach end of file while (line != null) < //write the line to console window Console.WriteLine(line); //Read the next line line = sr.ReadLine(); >//close the file sr.Close(); Console.ReadLine(); > catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finally
    Hello world 

    Запись в текстовый файл (пример 1)

    В следующем коде используется класс StreamWriter для открытия, записи и закрытия текстового файла. Аналогично тому, как используется класс StreamReader , можно передать путь к текстовому файлу в конструктор StreamWriter для автоматического открытия файла. Метод WriteLine записывает всю текстовую строку в текстовый файл.

    1. Запустите Visual Studio.
    2. В меню Файл выберите пункт Создать, а затем выберите Проект.
    3. Выберите Проекты Visual C# в разделе Типы проектов, а затем выберите Консольное приложение в разделе Шаблоны.
    4. Добавьте следующий код в начало файла Class1.cs:

    using System.IO; 
    try < //Pass the filepath and filename to the StreamWriter Constructor StreamWriter sw = new StreamWriter("C:\\Test.txt"); //Write a line of text sw.WriteLine("Hello World!!"); //Write a second line of text sw.WriteLine("From the StreamWriter class"); //Close the file sw.Close(); >catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finally
    Hello World!! From the StreamWriter class 

    Запись в текстовый файл (пример 2)

    В следующем коде используется класс StreamWriter для открытия, записи и закрытия текстового файла. В отличие от предыдущего примера, этот код передает в конструктор два дополнительных параметра. Первый параметр — путь к файлу и имя файла. Второй параметр, true , указывает, что файл открыт в режиме добавления. Если вы задаете false для второго параметра, содержимое файла перезаписывается при каждом запуске кода. Третий параметр задает Unicode , чтобы кодирование файла в StreamWriter выполнялось в формате Юникода. Можно также указать следующие методы кодирования для третьего параметра:

    Метод Write аналогичен методу WriteLine , за исключением того, что метод Write не вставляет автоматически сочетание символов возврата каретки или перевода строки (CR/LF). Это полезно, когда нужно одновременно записывать по одному символу.

    1. Запустите Visual Studio.
    2. В меню Файл выберите пункт Создать и затем пункт Проект.
    3. Нажмите Проекты Visual C# в разделе Типы проектов, а затем нажмите Консольное приложение в разделе Шаблоны.
    4. Добавьте следующий код в начало файла Class1.cs:

    using System.IO; using System.Text; 
    Int64 x; try < //Open the File StreamWriter sw = new StreamWriter("C:\\Test1.txt", true, Encoding.ASCII); //Write out the numbers 1 to 10 on the same line. for(x=0; x < 10; x++) < sw.Write(x); >//close the file sw.Close(); > catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finally

    Полный код сборки для чтения текстового файла

    //Read a Text File using System; using System.IO; namespace readwriteapp < class Class1 < [STAThread] static void Main(string[] args) < String line; try < //Pass the file path and file name to the StreamReader constructor StreamReader sr = new StreamReader("C:\\Sample.txt"); //Read the first line of text line = sr.ReadLine(); //Continue to read until you reach end of file while (line != null) < //write the line to console window Console.WriteLine(line); //Read the next line line = sr.ReadLine(); >//close the file sr.Close(); Console.ReadLine(); > catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finally < Console.WriteLine("Executing finally block."); >> > > 

    Полный код сборки для записи в текстовый файл (версия 1)

    //Write a text file - Version-1 using System; using System.IO; namespace readwriteapp < class Class1 < [STAThread] static void Main(string[] args) < try < //Pass the filepath and filename to the StreamWriter Constructor StreamWriter sw = new StreamWriter("C:\\Test.txt"); //Write a line of text sw.WriteLine("Hello World!!"); //Write a second line of text sw.WriteLine("From the StreamWriter class"); //Close the file sw.Close(); >catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finally < Console.WriteLine("Executing finally block."); >> > > 

    Полный код сборки для записи в текстовый файл (версия 2)

    //Write a text file - Version 2 using System; using System.IO; using System.Text; namespace readwriteapp < class Class1 < [STAThread] static void Main(string[] args) < Int64 x; try < //Open the File StreamWriter sw = new StreamWriter("C:\\Test1.txt", true, Encoding.ASCII); //Writeout the numbers 1 to 10 on the same line. for(x=0; x < 10; x++) < sw.Write(x); >//close the file sw.Close(); > catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finally < Console.WriteLine("Executing finally block."); >> > > 

    Устранение неполадок

    Перенос кода в блок try-catch-finally для обработки ошибок и исключений является хорошей практикой программирования, когда речь заходит о выполнении любых операций с файлом. В частности, может потребоваться освободить дескрипторы файла в окончательном блоке, чтобы файл не был заблокирован на неопределенный срок. Некоторые возможные ошибки включают файл, который не существует, или файл, который уже используется.

    Обратная связь

    Были ли сведения на этой странице полезными?

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

    В этой статье мы узнаем, как считывать данные из файлов и записывать информацию в файлы в программах си. Файлы в си используются для того, чтобы сохранять результат работы программы си и использовать его при новом запуске программы . Например можно сохранять результаты вычислений , статистику игр.
    Чтобы работать с файлами в си необходимо подключить библиотеку stdio.h
    #include
    Чтобы работать с файлом в си необходимо задать указатель на файл по образцу
    FILE *имя указателя на файл;
    Например
    FILE *fin;
    Задает указатель fin на файл
    Дальше необходимо открыть файл и привязать его к файловому указателю. Для открытия файла в си на чтение используется команда
    Имя указателя на файл= fopen(«путь к файлу», «r»);
    Например следующая команда
    fin = fopen(«C:\\Users\\user\\Desktop\\data.txt», «r»);
    откроет файл data.txt, находящийся на рабочем столе по пути C:UsersuserDesktop Чтобы узнать путь к файлу можно выбрать файл мышью нажать на правую кнопку мыши и выбрать свойства файла. В разделе Расположение будет указан путь к файлу. Обратите внимание , что в си путь указывается с помощью двух слешей.
    После работы с файлом в си , необходимо его закрыть с помощью команды
    fclose(имя указателя на файл)

    Считывание информации из текстового файла в Си

    Чтобы можно было считывать русские символы из файла, необходимо настроить работу с Кириллицей с помощью команды
    setlocale(LC_ALL, «Russian»);

    При этом необходимо в начале программы подключить #include

    Оператор fscanf()

    Для считывания слова из файла в си используется команда fscanf(). Эта команда аналогична команде ввода информации с клавиватуры в си scanf() только первый параметр это указатель на файл
    fscanf(указатель на файл,»%формат ввода данных1% форматввода данных2…»,&перменная1,&переменная2…);
    Например команда
    fscanf(fin,»%d%d%d»,&a,&b,&c);
    считает из файла, который привязан к указателю на файл fin строку из трех целочисленных переменных
    Разберем пример программы, которая считывает из текстового файла data.txt в которые записаны три столбца цифр информацию и записывает ее в массивы. Для каждого столбца информации свой массив. Подробно о работе с массивами в Си.
    #include
    #include
    main()
    < int a[10];
    int b[10];
    int c[10];
    int i;
    // определяем указатель на файл
    FILE *fin;
    // открываем файл на чтение
    fin = fopen(«C:\\Users\\user\\Desktop\\data.txt», «r»);
    // построчное считывание из файла
    for (i=0;i <3;i++)
    // считывание строки из трех значений файла и запись в массивы
    fscanf(fin,»%d%d%d»,&a[i],&b[i],&c[i]);
    >
    // вывод массивов на экран
    for (i=0;i <3;i++)
    printf(«%d %d %d\n»,a[i],b[i],c[i]);
    >
    getch();
    // закрытие файла
    fclose(fin);
    >

    Построковое считывание информации из файла в СИ.Функция fgets ( )

    Оператор fscanf() считывает из файла слово , т.е. до первого встречного пробела.
    Чтобы считать из файла всю строку из файла в Си используется конструкция
    if ( NULL != fgets (строковая переменная, длина строки, указатель на файл ) )
    действия при считывании строки
    >
    Например программа на Си которая считывает две строки из файла и выводит их на экран
    #include
    #include
    #include
    main()
    // задаем строковые перменные
    char st1[100];
    char st2[100];
    //определяем указатель на файл
    FILE *fin;
    // настриваем работу с Кириллицей
    setlocale(LC_ALL, «Russian»);
    // открываем файл на чтение
    fin = fopen(«C:\\data.txt», «r»);
    // считываем первую строку из файла
    if ( NULL != fgets ( st1, 100, fin ) )
    // выводим строку на экран
    printf(«%s «,st1);>
    // считываем вторую строку из файла
    if ( NULL != fgets ( st2, 100, fin ) )
    // выводим строку на экран
    printf(«%s\n»,st2);>
    // закрываем файл на чтение
    fclose(fin);
    >

    Запись информации в текстовый файл в Си

    Для записи данных в файл в Си, необходимо открыть файл в режиме записи
    Имя указателя на файл= fopen(«путь к файлу», «w»);
    Для записи в строку текстового файла используется команда fprnitf(), которая аналогична команде printf() вывод на экран в си только первый параметр это указатель на файл
    fprintf (имя указателя на файл,”%формат ввода”, переменные);
    Например запись в файл out.txt значение переменной а
    a=10;
    fout = fopen(«C:\\Users\\user\\Desktop\\out.txt», «w»);
    fprintf (fout,”%d”, a);
    Пример программы на си которая запрашивает два числа и записывает в файл out.txt оба эти числа и их сумму

    main()
    < int a;
    int b;
    int c;
    FILE *fout;
    fout = fopen(«C:\\Users\\user\\Desktop\\out.txt», «w»);
    printf («введите первое число \n»);
    scanf(«%d», &a);
    printf («введите второе число \n»);
    scanf(«%d», &b);
    c=a+b;
    fprintf(fout,»%d %d %d»,a,b,c);
    getch();
    fclose(fout);
    >

    Вернуться к содержанию Перейти к уроку Ошибки в программах на си

    Ввод данных из файла и вывод в файл в языке программирования С

    До этого при вводе-выводе данных мы работали со стандартными потоками — клавиатурой и монитором. Теперь рассмотрим, как в Си реализовано получение данных из файлов и запись их туда. Перед тем как выполнять эти операции, надо открыть файл и получить доступ к нему.

    В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:

    FILE *myfile;

    С другой стороны, функция fopen() открывает файл по указанному в качестве первого аргумента адресу в режиме чтения «r», записи «w» или добавления «a» и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:

    myfile = fopen("hello.txt", "r");

    Примечание. В случае использования относительной адресации текущим/рабочим каталогом в момент исполнения программы должен быть тот, относительно которого указанный относительный адрес корректен. Место нахождения самого исполняемого файла не важно.

    При чтении или записи данных в файл обращение к нему осуществляется посредством файлового указателя (в данном случае, myfile ).

    Если в силу тех или иных причин (нет файла по указанному адресу, запрещен доступ к нему) функция fopen() не может открыть файл, то она возвращает NULL . В реальных программах почти всегда обрабатывают ошибку открытия файла в ветке if , мы же далее опустим это.

    Объявление функции fopen содержится в заголовочном файле stdio.h , поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE .

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

    fclose(myfile);

    В программе может быть открыт не один файл. В таком случае каждый файл должен быть связан со своим файловым указателем. Однако если программа сначала работает с одним файлом, потом закрывает его, то указатель можно использовать для открытия второго файла.

    Чтение из текстового файла и запись в него

    fscanf

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

    fscanf(myfile, "%s%d", str, &a); 

    Возвращает количество удачно считанных данных или EOF. Пробелы, символы перехода на новую строку учитываются как разделители данных.

    Допустим, у нас есть файл содержащий такое описание объектов:

    apples 10 23.4 bananas 5 25.0 bread 1 10.3

    Тогда, чтобы считать эти данные, мы можем написать такую программу:

    #include int main () { FILE *file; struct food { char name[20]; unsigned qty; float price; }; struct food shop[10]; char i = 0; file = fopen("goods.txt", "r"); while (fscanf(file, "%s%u%f", shop[i].name, &(shop[i].qty), &(shop[i].price)) != EOF) { printf("%s %u %.2f\n", shop[i].name, shop[i].qty, shop[i].price); i++; } }

    В данном случае объявляется структура и массив структур. Каждая строка из файла соответствует одному элементу массива; элемент массива представляет собой структуру, содержащую строковое и два числовых поля. За одну итерацию цикл считывает одну строку. Когда встречается конец файла fscanf() возвращает значение EOF и цикл завершается.

    fgets

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

    fgets(массив_символов, количество_считываемых_символов, указатель_на_файл)
    fgets(str, 50, myfile)

    Такой вызов функции прочитает из файла, связанного с указателем myfile , одну строку текста полностью, если ее длина меньше 50 символов с учетом символа ‘\n’, который функция также сохранит в массиве. Последним (50-ым) элементом массива str будет символ ‘\0’, добавленный fgets . Если строка окажется длиннее, то функция прочитает 49 символов и в конце запишет ‘\0’. В таком случае ‘\n’ в считанной строке содержаться не будет.

    #include #define N 80 int main() { FILE *file; char arr[N]; file = fopen("goods.txt", "r"); while (fgets(arr, N, file) != NULL) printf("%s", arr); printf("\n"); fclose(file); }

    В этой программе в отличие от предыдущей данные считываются строка за строкой в массив arr . Когда считывается следующая строка, предыдущая теряется. Функция fgets() возвращает NULL в случае, если не может прочитать следующую строку.

    getc или fgetc

    Функция getc() или fgetc() (работает и то и другое) позволяет получить из файла очередной один символ.

    #include #define N 80 int main() { FILE *file; char str[N]; int i; file = fopen("goods.txt", "r"); while ((str[i] = fgetc(file)) != EOF) { if (str[i] == '\n') { str[i] = '\0'; printf("%s\n", str); i = 0; } else i++; } str[i] = '\0'; printf("%s\n",str); fclose(file); }

    Приведенный в качестве примера код выводит данные из файла на экран.

    Запись в текстовый файл

    Также как и ввод, вывод в файл может быть различным.

    • Форматированный вывод. Функция fprintf( файловый_указатель, строка_формата, переменные ) .
    • Построчный вывод. Функция fputs( строка, файловый_указатель ) .
    • Посимвольный вывод. Функция fputc() или putc( символ, файловый_указатель ) .

    Ниже приводятся примеры кода, в которых используются три способа вывода данных в файл.

    Запись в каждую строку файла полей одной структуры (прерывание в Linux ‒ Ctrl + D ):

    #include #define N 80 int main() { FILE *file; char str[N]; int i; file = fopen("goods.txt", "r"); while ((str[i] = fgetc(file)) != EOF) { if (str[i] == '\n') { str[i] = '\0'; printf("%s\n", str); i = 0; } else i++; } str[i] = '\0'; printf("%s\n",str); fclose(file); }

    Построчный вывод в файл ( fputs() , в отличие от puts() сама не помещает в конце строки ‘\n’):

    #include int main () { FILE *file; char str[10]; file = fopen("output.txt", "w"); while (scanf("%s", str) != EOF) { fputs(str, file); fputs("\n", file); } fclose(file); }

    Пример посимвольного вывода:

    #include int main() { FILE *file; char i; file = fopen("output.txt", "w"); while ((i = getchar()) != EOF) fputc(i, file); fclose(file); }

    Чтение из двоичного файла и запись в него

    С файлом можно работать не как с последовательностью символов, а как с последовательностью байтов. В принципе, с нетекстовыми файлами работать по-другому не возможно. Однако так можно читать и писать и в текстовые файлы. Преимущество такого способа доступа к файлу заключается в скорости чтения-записи: за одно обращение можно считать/записать существенный блок информации.

    При открытии файла для двоичного доступа, вторым аргументом fopen() является строка «rb» или «wb».

    Тема о работе с двоичными файлами достаточно сложная, для ее изучения требуется отдельный урок. Здесь будут отмечены только особенности функций чтения-записи в файл, который рассматривается как поток байтов.

    Функции fread() и fwrite() имеют следующие параметры:

    1. адрес области памяти, куда данные записываются или откуда считываются,
    2. размер одного данного какого-либо типа,
    3. количество считываемых данных указанного размера,
    4. файловый указатель.

    Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно «заказать» считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.

    Пример использования функций fread() и fwrite() :

    #include #include int main() { FILE *file; char shelf1[50], shelf2[100]; int n, m; file = fopen("shelf1.txt", "rb"); n = fread(shelf1, sizeof(char), 50, file); fclose(file); file = fopen("shelf2.txt", "rb"); m = fread(shelf2, sizeof(char), 50, file); fclose(file); shelf1[n] = '\0'; shelf2[m] = '\n'; shelf2[m+1] = '\0'; file = fopen("shop.txt", "wb"); fwrite(strcat(shelf2, shelf1), sizeof(char), n+m, file); fclose(file); }

    Здесь осуществляется попытка чтения из первого файла 50-ти символов. В n сохраняется количество реально считанных символов. Значение n может быть равно 50 или меньше. Данные помещаются в строку. То же самое происходит со вторым файлом. Далее первая строка присоединяется ко второй, и данные сбрасываются в третий файл.

    Курс с решением задач:
    pdf-версия

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *