![wc 命令是否从 txt 文件中删除尾部换行符?](https://linux22.com/image/152680/wc%20%E5%91%BD%E4%BB%A4%E6%98%AF%E5%90%A6%E4%BB%8E%20txt%20%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%A0%E9%99%A4%E5%B0%BE%E9%83%A8%E6%8D%A2%E8%A1%8C%E7%AC%A6%EF%BC%9F.png)
我目前正在构建命令行调用的副本wc
(用 C 语言)。我有一个文件 [tst.txt]
和读取该文件的 C 代码。该
wc tst.txt
命令以输出响应:2 6 20 tst.txt
,表示 2 个换行符 ('\n')。然而,我的代码有 3 次换行。我假设这是由于系统的在文件末尾尾随新行(第 3 行之后)。
我是否正确地认为该wc
命令会删除尾随换行符(我的意思是在 EOF 处尾随),或者我的一段代码不正确?
可能是我增加了一个额外的单位吗?
这是我的代码:
#include <stdio.h>
#include <string.h>
int checkForNewLine(char* line, int lineSize);
int main(int argc, char **argv) {
// declare variables
FILE *inputFile; // pointer to inputted file
inputFile = fopen(argv[1], "r"); // set input file to 2nd cmd-line arg.
int newLineCount = 0;
int newLineIncr = 0;
// if file is not found
if (inputFile == NULL){
printf("%s", "File not found\n");
return (-1); // end program
}
char line[201]; // set line to 200 char MAX.
while (fgets(line, 201, inputFile) != NULL){
// new line count
newLineCount = newLineCount + checkForNewLine(line, 201);
}
if (feof(inputFile)) {
}
else {
printf("%s", "Some Other Error...");
}
printf("New Line Count [%d]\n", (newLineCount));
fclose(inputFile);
}
int checkForNewLine(char *line, int lineSize){
int count = 0;
for (int i = 0; i < lineSize; i++) {
if (line[i] == '\0'){
count++;
printf("count amount: %d\n", count);
break;
}
}
return count;
}
答案1
The fgets() function shall read bytes from stream into the array
pointed to by s, until n−1 bytes are read, or a <newline> is read and
transferred to s, or an end-of-file condition is encountered.
所以你的代码计算最后一行,不管它末尾是否有换行符(事实并非如此),因为遇到了 EOF。毕竟,该checkForNewLine()
函数正在检查空字符,而不是换行符。使用od
、hexdump
等来验证输入文件的最后一个字符是什么。