清晰的阅读和打印.TXT在C文件行方式(Clearest way to read and print

2019-08-04 21:08发布

有一堆描述如何使用各种方法来打印出本网站的文本文件的行方式:

  • POSIX的风格 ,
  • 读书的IP地址 ,
  • 固定线路长度 。

他们似乎都针对一个具体的例子。

这将是巨大的,具有 清晰最简洁最简单的办法简单: 打印任何文本文件到屏幕的每一行。 最好有什么每一行做详细的解释。

分简洁和清晰。

Answer 1:

#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()函数是唯一一个需要任意字节流,并将其写入所有给定流。



Answer 2:

嗯,这里是一个很短的解决方案,我最终取得。 我想有somethign从根本上错了,否则会被建议,但我想我会在这里发布,并希望有人流泪它拆开:

#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);
    }
}


Answer 3:

@Dlinet,你正在努力学习如何组织计划一些有益的启示。 因为已经有一个真正优秀的答案,我将不会发布的代码; 我不可能在它改善。 不过,我想推荐一本书给你。

这本书是用Pascal称为软件工具 。 语言是帕斯卡,不C,但读的书,这将导致没有严重的困难。 他们开始了实现像在这个例子中(这在UNIX上被称为简单的工具cat ),他们转移到更先进的东西。 他们不仅教如何组织这类程序的重大教训,他们也涵盖语言设计问题。 (有帕斯卡的问题,确实扰乱他们,如果你懂C你会发现,C没有这些问题。)

这本书是绝版了,但我发现它是极有价值的时候我正在学写代码。 所谓“左边角设计”的方法所及的这一天。

我鼓励你在亚马逊或其他地方找到一个使用副本。 亚马逊使用拷贝最低$ 0.02加$ 4运费。

http://www.amazon.com/Software-Tools-Pascal-Brian-Kernighan/dp/0201103427

这将是一个教育运动,研究在这本书中的程序和C.实现它们的任何Linux系统已经有更强大的和完全调试这些程序的版本,但它不会是你的时间通过这个工作是浪费预订并学习如何写这个东西。

另外,您可以在您的计算机上安装FreePascal的,并用它来运行从书的程序。

祝你好运,愿你时时享受软件开发!



Answer 4:

如果你想要的东西预焙,有cat在POSIX系统。

如果你想自己动手写,这里的基本布局:

  1. 检查以确保文件名,权限和路径是有效的
  2. 阅读直到换行分隔在一个循环(\ n在Unix上,在Windows / DOS \ r \ n)
  3. 检查错误。 如果是的话,打印错误中止。
  4. 打印线屏幕。
  5. 重复

问题的关键是,有没有真正做到这一点的特定方式。 刚看完,然后写,然后重复。 对于某些错误检查,你有猫一遍。



文章来源: Clearest way to read and print .txt file lines in C