【发布时间】:2012-10-28 03:17:40
【问题描述】:
我正在尝试使用strcmp() 来测试文本文件中的特定行是否等于换行符(\n)。我从一个文本文件中收集每一行,并将它们写入另一个文本文件。如果源文件中的整行只是一个换行符,我不想在目标文件中写入该行。
我认为下面的代码可以用于此目的,但事实并非如此。但是,如果我将条件中的数值从 0 更改为 3,它就像我希望它工作一样工作。知道为什么吗?
我的目标是更改条件,使其使用数值 0,这意味着 strcmp() 找到完全匹配,但我不知道如何更改条件的其他部分来做到这一点。
#include <stdio.h>
void process_file(const char *inp_file, FILE *otp_fp) {
char line[256];
FILE *inp_fp = fopen(inp_file, "r");
if (inp_fp != NULL) {
while(fgets(line, 256, inp_fp) != NULL) {
if (strcmp (line, "\n") != 0) { //changing to 3 gets desired result
fprintf(otp_fp, line);
}
}
}
fclose(inp_fp);
}
【问题讨论】:
-
这对我有用。还有其他可能的错误吗?
-
你确定你的行不是以 CRLF 结尾而不是普通的 LF 结尾吗?试试 strcmp(line, "\r\n")
-
"\r\n" 正如您所建议的那样有效。谢谢。我想知道为什么它以原始形式适用于 squiguy。我会进一步研究。
-
@nairware 我使用 Linux 运行它,其中
\n是行尾。您必须使用\r\n是行尾的 Windows。 -
如果您在 Windows 上,该文件将作为文本文件打开(因为该模式下没有
b),因此 CRLF 将在输入时映射到 NL。如果将文件作为二进制文件从 Windows 复制到 Unix(包括 Mac),则 CRLF 结尾保持不变。如果您使用 FTP 并指定文本 (ASCII) 模式传输,则 CRLF 结尾将再次固定。您必须做出决定;当您的程序在 Unix 上运行时,您是否希望您的程序能够处理源自 Windows 的文件?如果是这样,那么您需要比较两个行尾;如果没有,请选择您当地的结局。