Как прочитать строку из файла c в строку
Обновлено: 21.11.2024
Данные хранятся в файлах, чтобы при необходимости их можно было извлечь для обработки. Команды для чтения данных из файла (по большей части) очень похожи на те, которые используются для чтения данных с клавиатуры. Однако здесь описаны некоторые важные различия.
Чтобы ваша программа могла читать из файла, вы должны:
- включить заголовочный файл fstream с помощью std::ifstream;
- объявить переменную типа ifstream
- открыть файл
- проверить наличие ошибки открытия файла
- читать из файла
- после каждого чтения проверять наличие конца файла с помощью функции-члена eof()
- закрыть файл, когда доступ больше не нужен (необязательно, но рекомендуется)
В этом примере переменная indata объявлена как тип ifstream. Он используется так же, как cin используется для ввода с клавиатуры. Оператор indata >> num; читает символы из файла и преобразует их в значение данных соответствующего типа — в данном случае целое число. При этом пробельные символы пропускаются; такое же действие происходит в случае чтения в переменную типа char, float или double. (Пробелы включают пробел, табуляцию, новую строку). Несколько значений могут быть прочитаны с использованием одного и того же оператора ввода. Например: данные >> число1 >> число2 >> число3;
При открытии файла всегда следует проверять его успешность, прежде чем продолжить. ! оператор для имени файла возвращает true, если файл не может быть открыт. Значение indata.eof() равно true, если самая последняя попытка чтения значения была неудачной (т. е. данных больше нет).
В следующем примере показано, как читать по одному символу за раз.
Приведенный выше пример считывает и выводит символы из файла до тех пор, пока не встретится буква Q, после чего программа останавливается. Обратите внимание, что пробелы (пробелы) пропускаются и не отображаются в выводе — фактически считываются только 6 символов.
В следующем примере показано, как прочитать всю строку с помощью оператора >>.
При чтении символьных значений в строковую переменную с помощью >> символы считываются до тех пор, пока не встретится пробел. Программист несет ответственность за то, чтобы строковая переменная была достаточно большой для хранения всех прочитанных символов. Таким образом, для INPUT1 символы 'ab123' считываются и сохраняются в переменном слове. Пробел между «3» и «5» завершает операцию чтения. Во втором примере программист допустил ошибку, так как в строке есть место только для 10 символов, но компьютер продолжил чтение до буквы «p». Фактический результат в этой ситуации будет зависеть от используемого компьютера.
В некоторых ситуациях желательно прочитать всю строку ввода, включая пробелы. Например: чтобы прочитать имя, такое как «Джо Студент», в одну строковую переменную. Это можно сделать с помощью функции-члена getline.
В этом примере функция getline будет считывать символы из файла, помещая их в слово массива, пока не будут прочитаны 9 символов (оставляя один пробел для символа NULL) или пока не будет прочитан разделитель '\n'. Если в строке более 9 символов, то эти «лишние» символы остаются во входном буфере. Если имеется 8 или менее символов, считывается вся строка, а разделитель удаляется из буфера. Обратите внимание, что если символов ровно 9, разделитель не удаляется из буфера.
Функция peek() используется для чтения одного символа из входного потока, оставляя символ в буфере. Символ будет прочитан со следующим оператором ввода. Функция putback() используется для возврата последнего прочитанного символа во входной поток.
В стандартной библиотеке есть ряд функций для чтения содержимого файла, одни из которых считывают отдельные символы, а другие — строки. Более эффективными и полезными из двух будут те, которые работают со строками, но функции, работающие с символами, будут рассмотрены в первую очередь, потому что есть ситуации, в которых может быть предпочтительнее чтение определенных символов. Эти функции предназначены для работы с файлами, которые уже были открыты функцией fopen(), которая возвращает указатель и, таким образом, принимает указатель файла в качестве аргумента.
Чтение символов из файлов с помощью функции "получить символ из файла" fgetc()
Функция fgetc() принимает указатель на файл в качестве аргумента и считывает один символ из файла. После чтения символа указатель файла перемещается на следующий символ. Он также будет читать символы новой строки. Если указатель находится в конце файла или произошла ошибка, эта функция возвращает EOF.
Примечание: возвращаемый тип — int (не char), поэтому рекомендуется присваивать возвращаемые значения этих функций переменной целочисленного типа. Подробнее см. здесь.
Выйти из полноэкранного режима
Чтобы использовать эту функцию на практике, в следующем примере демонстрируются основные принципы использования и рекомендуемые методы (например, проверки достоверности).
Выйти из полноэкранного режима
Мы надеемся, что комментарии в приведенном выше коде прояснят, что происходит.
Дополнительной функцией для записи символов в файлы является fputc() .
Чтение строк из файлов с помощью "file get string" - fgets()
Для чтения файлов используйте fgets() , что я читал в уме как "строка получения файла".
Упрощенное объяснение состоит в том, что он читает текст из файла до тех пор, пока не встретит символ новой строки. Другими словами, он будет читать по одной строке из файла за раз.
Более полное объяснение состоит в том, что функция fgets() будет считывать всю строку до символа "новой строки" \n, нулевого символа завершения (он же "конец строки") символа \0 , EOF или числа. заданных пользователем символов (переданных в качестве одного из аргументов) - в зависимости от того, какой из них произойдет раньше. Область памяти для хранения данных, считываемых функцией fgets(), должна быть создана до вызова функции, и именно в ней будут храниться данные, считанные функцией.
Он принимает 3 аргумента: указатель на массив символов, в котором будут храниться прочитанные данные, максимальное количество символов для чтения (целое число, включая завершающий нулевой символ) и указатель на файл. быть прочитанным.
Он вернет первый аргумент (строку, которая была прочитана).
Обнаружена ошибка или EOF, функция вернет NULL.
Нулевой терминатор будет добавлен функцией в конец строки, поэтому имейте это в виду при выделении места для первых двух аргументов.
Чтение строк из текстового файла
Всем привет. Файл с именем «grades.txt» содержит оценки учащихся за курс в следующем формате, разделенном пробелами: (следует пример файла)
Имя Фамилия Промежуточный финал
Али Калискан 60 40
Вели Далгач 80 10
Тюркан Севимли 90 50
Али Йылмаз 30 70
Ахмет Коч 50 50< /p>
Напишите программу, которая подсчитывает общие оценки учащихся и записывает их в два отдельных файла: «passed.txt» и «failed.txt». Среднесрочная оценка составляет 40 процентов, а окончательная — 60 %. Проходной балл — 50. Ниже приведены примеры выходных файлов:
Имя Фамилия Промежуточный финал Итого
пройдено.txt:
Туркан Севимли 90 50 66
Али Йылмаз 30 70 54
Ахмет Коч 50 50 50
не пройдено .txt:
Али Калискан 60 40 48
Вели Далгач 80 10 38
Я разделил (Туркан) (Севимли) (90) (50), но как выбрать числа и сложить их?
если учащийся имеет оценку выше 50, программа должна отправить его в файл pass.txt, иначе failed.txt.
Для чтения чисел вы, вероятно, захотите использовать спецификатор формата "%d" для scanf. Чтобы пропустить пробелы, вы можете добавить пробел к строке формата (вам не нужна переменная 'junk'). Если вы используете формат квадратных скобок %[. ], не ставьте «s» после квадратных скобок. например,
Обратите внимание, что слово "линия" здесь вводит в заблуждение. Этот код считывает не всю строку, а «имя» или «токен».
Для выполнения задания вам понадобится дополнительный код для чтения цифр. Возможно, вам понадобятся два дополнительных указателя FILE для текстовых файлов «пройдено» и «не пройдено» (откройте их для записи). Затем вам понадобится некоторая логика, чтобы определить, следует ли записывать каждого учащегося, которого вы читаете, в файл «сдал» или «не сдал».
Первоначально опубликовано c99tutorial
Для чтения чисел вы, вероятно, захотите использовать спецификатор формата "%d" для scanf. Чтобы пропустить пробелы, вы можете добавить пробел к строке формата (вам не нужна переменная 'junk'). Если вы используете формат квадратных скобок %[. ], не ставьте «s» после квадратных скобок. например
Обратите внимание, что слово "линия" здесь вводит в заблуждение. Этот код считывает не всю строку, а «имя» или «токен».
Для выполнения задания вам понадобится дополнительный код для чтения цифр. Возможно, вам понадобятся два дополнительных указателя FILE для текстовых файлов «пройдено» и «не пройдено» (откройте их для записи). Затем вам потребуется некоторая логика, чтобы определить, следует ли записывать каждого учащегося, которого вы читаете, в файл «сдал» или «не сдал».
В последней главе объяснялись стандартные устройства ввода и вывода, поддерживаемые языком программирования C. В этой главе рассказывается, как программисты C могут создавать, открывать, закрывать текстовые или двоичные файлы для хранения своих данных.
Файл представляет собой последовательность байтов, независимо от того, является ли он текстовым или двоичным файлом. Язык программирования C обеспечивает доступ к функциям высокого уровня, а также к низкоуровневым (на уровне ОС) вызовам для обработки файлов на ваших устройствах хранения. В этой главе вы познакомитесь с важными функциями управления файлами.
Открытие файлов
Вы можете использовать функцию fopen() для создания нового файла или для открытия существующего файла. Этот вызов инициализирует объект типа FILE, который содержит всю информацию, необходимую для управления потоком. Прототип вызова этой функции выглядит следующим образом:
Здесь имя файла — это строковый литерал, который вы будете использовать для именования файла, а режим доступа может иметь одно из следующих значений —
Открывает существующий текстовый файл для чтения.
Открывает текстовый файл для записи. Если его нет, то создается новый файл. Здесь ваша программа начнет записывать содержимое с начала файла.
Открывает текстовый файл для записи в режиме добавления. Если его нет, то создается новый файл. Здесь ваша программа начнет добавлять содержимое в существующее содержимое файла.
Открывает текстовый файл как для чтения, так и для записи.
Открывает текстовый файл как для чтения, так и для записи. Сначала он усекает файл до нулевой длины, если он существует, иначе создает файл, если он не существует.
Открывает текстовый файл как для чтения, так и для записи. Он создает файл, если он не существует. Чтение начнется с начала, но запись может быть только добавлена.
Если вы собираетесь работать с бинарными файлами, вы будете использовать следующие режимы доступа вместо упомянутых выше —
Закрытие файла
Чтобы закрыть файл, используйте функцию fclose(). Прототип этой функции —
Функция fclose(-) возвращает ноль в случае успеха или EOF, если при закрытии файла возникла ошибка. Эта функция фактически сбрасывает все данные, все еще ожидающие в буфере, в файл, закрывает файл и освобождает всю память, используемую для файла. EOF — это константа, определенная в заголовочном файле stdio.h.
Стандартная библиотека C предоставляет различные функции для чтения и записи файла, посимвольно или в виде строки фиксированной длины.
Запись файла
Ниже приведена простейшая функция для записи отдельных символов в поток —
Функция fputc() записывает символьное значение аргумента c в выходной поток, на который ссылается fp. Он возвращает письменный символ, записанный в случае успеха, иначе EOF, если есть ошибка. Вы можете использовать следующие функции для записи строки с завершающим нулем в поток —
Функция fputs() записывает строку s в выходной поток, на который ссылается fp. В случае успеха он возвращает неотрицательное значение, в противном случае в случае какой-либо ошибки возвращается EOF. Вы также можете использовать функцию int fprintf(FILE *fp,const char *format, . ) для записи строки в файл. Попробуйте следующий пример.
Убедитесь, что у вас есть каталог /tmp. Если это не так, то прежде чем продолжить, вы должны создать этот каталог на своем компьютере.
Когда приведенный выше код скомпилирован и выполнен, он создает новый файл test.txt в каталоге /tmp и записывает две строки, используя две разные функции. Давайте прочитаем этот файл в следующем разделе.
Чтение файла
Ниже приведена простейшая функция для чтения одного символа из файла —
Функция fgetc() считывает символ из входного файла, на который ссылается fp. Возвращаемое значение — это прочитанный символ, или в случае какой-либо ошибки он возвращает EOF. Следующая функция позволяет прочитать строку из потока —
Функция fgets() считывает до n-1 символов из входного потока, на который ссылается fp. Он копирует прочитанную строку в буфер buf, добавляя нулевой символ для завершения строки.
Если эта функция встречает символ новой строки '\n' или конец файла EOF до того, как будет прочитано максимальное количество символов, она возвращает только символы, прочитанные до этой точки, включая символ новой строки. Вы также можете использовать функцию int fscanf(FILE *fp, const char *format, . ) для чтения строк из файла, но она останавливает чтение после обнаружения первого символа пробела.
Когда приведенный выше код компилируется и выполняется, он считывает файл, созданный в предыдущем разделе, и выдает следующий результат —
Давайте немного подробнее рассмотрим, что здесь произошло. Во-первых, fscanf() читала только это, потому что после этого она столкнулась с пробелом, второй вызов для fgets(), который читает оставшуюся строку, пока не встретит конец строки. Наконец, последний вызов fgets() полностью считывает вторую строку.
Двоичные функции ввода/вывода
Есть две функции, которые можно использовать для двоичного ввода и вывода —
Обе эти функции следует использовать для чтения или записи блоков памяти — обычно это массивы или структуры.
Читайте также: