gpt4 book ai didi

C:Windows 与 Linux 中的 strtok 和换行符

转载 作者:太空宇宙 更新时间:2023-11-04 08:29:49 25 4
gpt4 key购买 nike

我正在做一项本应在 Windows 上完成的 C 学校作业,但是,我正在 OS X 上对其进行编程。虽然其他在 Windows 上工作的学生在读取文件时没有问题,但我有.

导师提供的代码使用以下代码在 \n 上拆分文件的内容:

/* Read ADFGX information */
adfgx = read_from_file("adfgx.txt");

/* Define the alphabet */
alphabet = strtok(adfgx, "\n");

/* Define the code symbols */
symbols = strtok(NULL, "\n");

然而,文件 adfgx.txt(为作业提供)有 Windows 风格的换行符(\r\n):我用十六进制编辑器检查了它.因此,使用 Visual Studio 中的 Microsoft C 编译器编译它并在 Windows 上运行它会在换行符 (\r\n) 上正确拆分文件。我觉得这很奇怪,因为我找不到关于此行为的任何文档。另一部分:当我使用 gcc 在 OS X 上编译它并运行它时:\r 仍然包含在标记化字符串中,因为它显然在 \n。如果我将分隔符更改为对 "\r\n"strtok 调用,它对我有用。

这在 Windows 和 Unix 上表现不同是否正常?在现实生活中我应该如何处理这个问题(假设我正在尝试用 C 为 Windows 和 Unix 编写可移植代码,这些代码应该处理使用 \r\n 的文件输入)?

最佳答案

如果您在 Windows 上使用 fopen("adfgx.txt", "r") 打开文件,文件将以“文本模式”打开,\r char 从后续的 fread 调用中隐式地剥离。如果您在 Windows 上使用 fopen("adfgx.txt", "rb") 打开文件,文件将以“二进制模式”打开,并且 \r炭仍然存在。要了解“rb”模式和其他模式字符串,您可以阅读 Windows 上的 fopen 采用的不同模式参数 here .正如您可能想象的那样,Windows 上的 fwrite 会自动将 \r 插入到 \n 字符前面的流中(只要该文件未以二进制模式打开)。

Unix 和 MacOS 将 \r 视为任何普通字符。因此,strok(NULL, "\n") 不会删除 '\r' 字符,因为您没有拆分它。

简单的跨平台修复是在所有平台上调用 strtok,如下所示:

/* Define the alphabet */
alphabet = strtok(adfgx, "\r\n");

而且我认为传递 "\r\n" 作为分隔符字符串将解决您在 Windows 上读取文本文件的大部分问题,反之亦然。我认为 strtok 在这两种情况下都不会返回空字符串,但您可能需要在每次 strtok 调用时检查空字符串(并再次调用它以读取下一行)。

关于C:Windows 与 Linux 中的 strtok 和换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28928990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com