我正在进行一项旨在在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
上分裂。如果我将分隔符更改为strtok
对"\r\n"
的调用,则对我有用。
这在Windows和Unix上的表现是否正常?我应该如何在现实生活中处理这个问题(假设我正在尝试用C编写可以处理使用\r\n
的文件输入的Windows和Unix的可移植代码?)
答案 0 :(得分:2)
如果在Windows上使用fopen("adfgx.txt", "r")
打开文件,文件将以"文本模式打开"并且\r
char会从后续fread
次调用中隐式删除。如果您使用fopen("adfgx.txt", "rb")
在Windows上打开了该文件,则文件将以"二进制模式"打开,并且\r
字符仍然存在。要了解" rb"模式和其他模式字符串,您可以阅读有关Windows上fopen here的不同模式参数。正如您可能想象的那样,Windows上的fwrite
将自动在\r
字符前面的流中插入\n
(只要该文件未以二进制模式打开)。 / p>
Unix和MacOS将\r
视为任何普通字符。因此,strok(NULL, "\n")
不会剥夺' \ r' char,因为你没有分裂。
简单的跨平台修复方法是在所有平台上按如下方式调用strtok:
/* Define the alphabet */
alphabet = strtok(adfgx, "\r\n");
我认为传递"\r\n"
作为分隔符字符串将清除您在Windows上阅读文本文件的大部分问题,反之亦然。我不认为strtok在任何一种情况下都会返回一个空字符串,但你可能需要在每次strtok调用时检查一个空字符串(并再次调用它来读取下一行)。