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

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

  • Posix风格 ,
  • 读取IP地址 ,
  • 固定线长 。

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

如果能够使用最清晰最简洁最简单的方法,那就太棒了: 将任何文本文件的每一行打印到屏幕上。 优选地详细说明每条线的作用。

简洁明了的要点。

 #include  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 (因为你最终必须释放它分配的内存):

 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  main() { FILE *MyFile; int c; MyFile=fopen("C:\YourFile.txt","r"); c = fgetc(MyFile); while (c!=EOF) { printf("%c",c); c = fgetc(MyFile); } } 

@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系统都已经拥有这些程序的function更强大且完全调试的版本,但这不会浪费你的时间来完成这个预订并学习如何写这些东西。

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

祝你好运,也许你总是享受软件开发!

如果你想要预先烤好的东西,就可以在POSIX系统上找到它。

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

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

关键是,没有特定的方法来做到这一点。 只需阅读,然后写,然后重复。 通过一些错误检查,你再次得到了猫。