在C中读取和打印.text文件行的最清晰方法

时间:2012-12-28 00:00:33

标签: c file-io scanf printf file-read

有很多方法可以描述如何使用各种方法在此网站上打印文本文件的行:

它们似乎都是根据具体的例子量身定做的。

最清晰最简洁最简单方式简单地打印出来会非常棒: 打印每一行任何文本文件到屏幕上。 最好详细说明每行的内容。

简洁明了的要点。

4 个答案:

答案 0 :(得分:9)

#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()和{{1 }} 将不会。到目前为止,这两个版本都是严格标准的C(标准的任何版本),因为它们不使用任何特定于平台的扩展;它们和代码一样便携。

或者,再次,如果你有POSIX 2008 getline()函数,你可以使用它,但你也需要fputs()(因为你最终必须释放它分配的内存):

#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()函数是唯一一个获取任意字节流并将它们全部写入的函数。给定流。

答案 1 :(得分:3)

嗯,这是我最终做出的一个非常简短的解决方案。我想有一些根本性的错误,否则它本来会被建议,但我想我会把它发布在这里并希望有人把它分开:

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

答案 2 :(得分:1)

@Dlinet,您正在尝试学习一些有关如何组织程序的有用课程。我不会发布代码,因为已经有一个非常好的答案;我无法改进它。但我想向你推荐一本书。

这本书在Pascal中被称为软件工具。语言是Pascal,而不是C语言,但是读这本书不会造成严重的困难。他们开始实现简单的工具,例如本例中的工具(在UNIX上称为cat),然后他们转向更高级的东西。他们不仅教授如何组织这类计划的精彩课程,还涵盖语言设计问题。 (Pascal中有些问题确实让他们烦恼,如果你知道C,你会发现C没有那些问题。)

这本书已经绝版了,但是当我学习编写代码时,我发现它非常有价值。所谓的“左角设计”方法至今仍然适合我。

我鼓励您在亚马逊或任何地方找到旧版本。亚马逊使用的副本起价为0.02美元加上4美元的运费。

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

学习本书中的程序并在C中实现它将是一项教育练习。任何Linux系统都已经拥有更强大和完全调试的这些程序版本,但这不会浪费你的时间完成本书并学习如何编写这些内容。

或者,您可以在计算机上安装FreePascal并使用它来运行本书中的程序。

祝你好运,也许你总是喜欢软件开发!

答案 3 :(得分:0)

如果您想要预先烘焙的东西,POSIX系统上会有cat

如果您想自己编写,这是基本布局:

  1. 检查以确保文件名,权限和路径有效
  2. 在循环中读取直到换行符分隔符(在Unix上为\ n,在Windows / DOS上为\ r \ n)
  3. 检查错误。如果是这样,打印错误就会中止。
  4. 将行打印到屏幕。
  5. 重复
  6. 关键是,没有特定的方法来做到这一点。只需阅读,然后写,然后重复。通过一些错误检查,你再次得到了猫。