有很多方法描述如何使用各种方法在此站点上打印文本文件的行:
它们似乎都是根据具体的例子量身定做的。
如果能够使用最清晰 , 最简洁和最简单的方法,那就太棒了: 将任何文本文件的每一行打印到屏幕上。 优选地详细说明每条线的作用。
简洁明了的要点。
#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()
将处理数据中具有空字节( ' '
)的任意二进制文件,但使用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美元的运费。
学习本书中的程序并在C中实现它将是一项教育练习。任何Linux系统都已经拥有这些程序的function更强大且完全调试的版本,但这不会浪费你的时间来完成这个预订并学习如何写这些东西。
或者,您可以在计算机上安装FreePascal并使用它来运行本书中的程序。
祝你好运,也许你总是享受软件开发!
如果你想要预先烤好的东西,就可以在POSIX系统上找到它。
如果您想自己编写,这里是基本布局:
关键是,没有特定的方法来做到这一点。 只需阅读,然后写,然后重复。 通过一些错误检查,你再次得到了猫。
以上就是c/c++开发分享在C中读取和打印.txt文件行的最清晰方法相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560824.html