我在C中使用文件处理来打开CSV文件,因为我使用的是Windows操作系统,所以CSV文件的换行符是\ r \ n
if( buffer[i] == "\r\n")
{
printf("New line encountered");
}
但是当我编译代码时,我收到错误"警告:指针和整数之间的比较"。那有什么方法可以解决这个问题吗?
修改
if (buffer[i]=='\r' && buffer[i+1]=='\n')
上面的代码行已删除警告,但仍未检测到换行符
答案 0 :(得分:1)
buffer [i]是一个字符,“\ r \ n”是一个字符串,你无法比较它们。如果这样做,该字符将转换为整数,并显示您看到的警告。
您可以使用'\r' == buffer[i] && '\n' == buffer[i + 1]
来比较它们,并注意索引边缘。
答案 1 :(得分:0)
您正在将单个字符(buffer[i]
)与指向字符数组(char* = "\r\n"
)的指针进行比较。在这种情况下,您必须单独检查\r
和\n
。一个简单的状态机就足够了(检查char是\ r \ n还是\ n,如果找到\ n,则最后一个字符不是\ r \ n)
答案 2 :(得分:0)
在Windows上,如果您将文件作为文本文件而不是二进制文件打开(即使用fopen(filename, "r")
而不是fopen(filename, "rb")
,则需要C运行时映射本机行结束于Unix风格的\n
行结尾。如果以二进制模式打开文件,则不会发生此映射。
因此,您没有看到CR('\r'
)字符,因为运行时已将其删除。这就是为什么在C标准中描述文本流有如此多的措辞谨慎的例外情况。该标准允许'\r'
- 仅限行结尾('\r'
映射到'\n'
);它允许固定长度的记录(删除尾随空格;插入换行符);它允许CRLF行结尾(字符对映射到'\n'
);它允许NL(aka LF)行结尾(不需要映射)。
§7.21.2流
¶2文本流是由行组成的有序字符序列,每行由零个或多个字符加上一个终止的换行符组成。最后一行是否需要终止换行符是实现定义的。可能必须在输入和输出上添加,更改或删除字符,以符合在主机环境中表示文本的不同约定。因此,流中的字符与外部表示中的字符之间不需要一一对应。从文本流读入的数据必须与之前写入该流的数据相等,只有在以下情况下:数据仅包含打印字符,控制字符包含水平制表符和新行;空格字符前面不会有任何换行符;最后一个字符是换行符。在读入时是否出现在换行符之前立即写出的空格字符是实现定义的。
¶7.21.3文件
¶2...文本流上的写入是否导致关联文件被截断超出该点是实现定义的。
§7.21.9.2
fseek
函数¶4对于文本流,
offset
应为零,或者offset
应为先前成功调用与ftell
函数关联的流上的whence
函数返回的值。同一个文件和{{1}}应为SEEK_SET。