Самый простой способ прочитать и напечатать строки.txt файла в C
Существует множество способов описать, как использовать различные методы для распечатки строк текстового файла на этом сайте:
Все они, похоже, приспособлены к конкретному примеру.
Было бы здорово иметь самый ясный и краткий и простой способ просто: выводить каждую строку любого текстового файла на экран. Желательно с подробными объяснениями того, что делает каждая строка.
Очки для краткости и ясности.
4 ответа
#include <stdio.h>
static void cat(FILE *fp)
{
char buffer[4096];
size_t nbytes;
while ((nbytes = fread(buffer, sizeof(char), sizeof(buffer), fp)) != 0)
fwrite(buffer, sizeof(char), nbytes, stdout);
}
int main(int argc, char **argv)
{
FILE *fp;
const char *file;
while ((file = *++argv) != 0)
{
if ((fp = fopen(file, "r")) != 0)
{
cat(fp);
fclose(fp);
}
}
return(0);
}
cat()
Функция не является строго необходимой, но я бы лучше ее использовал. Основная программа просматривает каждый аргумент командной строки и открывает указанный файл. Если это удается, он вызывает cat()
функция для печати его содержимого. Поскольку призыв к fopen()
не указывает "rb"
, он открывается как текстовый файл. Если файл не открыт, этот код молча игнорирует проблему. Если файлы не указаны, ничего не печатается вообще.
cat()
Функция просто читает блоки текста размером до 4096 байт за раз и записывает их в стандартный вывод ("экран"). Он останавливается, когда больше нечего читать.
Если вы хотите расширить код для чтения стандартного ввода, когда файл не указан, вы можете использовать:
if (argc == 1)
cat(stdin);
else
{
...while loop as now...
}
которая является одной из причин наличия cat()
функция написана как показано.
Этот код не обращает прямого внимания на новые строки - или любые строки. Если вы хотите обработать его формально по одной строке за раз, то вы можете сделать несколько вещей:
static void cat(FILE *fp)
{
char buffer[4096];
while (fgets(buffer, sizeof(buffer), fp) != 0)
fputs(buffer, stdout);
}
Это будет читать и писать по одной строке за раз. Если какая-либо строка длиннее 4095 байт, она прочитает строку за две или более операций и запишет ее за то же количество операций. Обратите внимание, что это предполагает текстовый файл таким образом, что версия, использующая fread()
а также fwrite()
не. В системах POSIX версия с fread()
а также fwrite()
будет обрабатывать произвольные двоичные файлы с нулевыми байтами ('\0'
) в данных, но версия, использующая fgets()
а также fputs()
не буду. Обе версии пока являются строго стандартными C (любая версия стандарта), так как они не используют какие-либо специфичные для платформы расширения; они настолько переносимы, насколько может быть код.
Снова в качестве альтернативы, если у вас есть POSIX 2008 getline()
функция, вы можете использовать это, но вам нужно #include <stdlib.h>
тоже (потому что вы в конечном итоге должны освободить память, которую он выделяет):
static void cat(FILE *fp)
{
char *buffer = 0;
size_t buflen = 0;
while (getline(&buffer, &buflen, fp) != -1)
fputs(buffer, stdout);
free(buffer);
}
Эта версия также не будет обрабатывать двоичные данные (т.е. данные с нулевыми байтами в нем). Конечно, его можно обновить, чтобы сделать это:
static void cat(FILE *fp)
{
char *buffer = 0;
size_t buflen = 0;
ssize_t nbytes;
while ((nbytes = getline(&buffer, &buflen, fp)) != -1)
fwrite(buffer, sizeof(char), nbytes, stdout);
free(buffer);
}
getline()
Функция сообщает, сколько байтов она прочитала (после этого есть нулевой байт), но fwrite()
Функция - единственная, которая принимает поток произвольных байтов и записывает их все в данный поток.
Ну, вот очень короткое решение, которое я в конце концов принял. Я полагаю, что с этим что-то принципиально не так, иначе это было бы предложено, но я решил опубликовать его здесь и надеяться, что кто-то разорвёт его на части:
#include <stdio.h>
main()
{
FILE *MyFile;
int c;
MyFile=fopen("C:\YourFile.txt","r");
c = fgetc(MyFile);
while (c!=EOF)
{
printf("%c",c);
c = fgetc(MyFile);
}
}
@Dlinet, вы пытаетесь извлечь некоторые полезные уроки о том, как организовать программу. Я не буду публиковать код, потому что уже есть действительно отличный ответ; Я не могу улучшить это. Но я бы хотел порекомендовать вам книгу.
Книга называется Software Tools in Pascal. Язык Паскаль, а не C, но для чтения книги это не вызовет серьезных затруднений. Они начинают реализовывать простые инструменты, такие как в этом примере (который в UNIX называется cat
) и они переходят к более сложным вещам. Они не только преподают отличные уроки о том, как организовать такую программу, но и освещают вопросы языкового дизайна. (В Паскале есть проблемы, которые действительно их раздражают, и если вы знаете C, вы поймете, что у C таких проблем нет.)
Книга больше не печатается, но я обнаружил, что она чрезвычайно ценна, когда я учился писать код. Так называемая методология "дизайна левого угла" хорошо мне подходит и по сей день.
Я рекомендую вам найти использованную копию на Amazon или где-либо еще. Amazon использовала копии, начиная с 0,02 доллара плюс доставка 4 доллара.
http://www.amazon.com/Software-Tools-Pascal-Brian-Kernighan/dp/0201103427
Было бы полезно изучить программы из этой книги и внедрить их в C. Любая система Linux уже имеет более мощные и полностью отлаженные версии этих программ, но это не будет пустой тратой времени на проработку этой программы. Книга и научиться писать эти вещи.
В качестве альтернативы вы можете установить FreePascal на свой компьютер и использовать его для запуска программ из книги.
Удачи, и вам всегда может понравиться разработка программного обеспечения!
Если вы хотите что-то заранее запеченное, есть cat
в системах POSIX.
Если вы хотите написать это самостоятельно, вот основная схема:
- Убедитесь, что имя файла, разрешения и путь верны
- Чтение разделителя новой строки в цикле (\n в Unix, \r\n в Windows/DOS)
- Проверьте на ошибку. Если это так, выведите ошибку об отмене.
- Вывести строку на экран.
- Повторение
Дело в том, что на самом деле не существует конкретного способа сделать это. Просто прочитайте, затем напишите и повторите. С некоторой проверкой ошибок у вас снова появляется кошка.