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

时间:2015-03-08 16:37:19

标签: c linux windows file

我正在进行一项旨在在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的可移植代码?)

1 个答案:

答案 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调用时检查一个空字符串(并再次调用它来读取下一行)。