我有一个奇怪的错误。
我写了一个获取文件并返回每行长度的函数:
void readFile1(char *argv[], int fileNumber,
char *array_of_lines[NUMBER_OF_LINES+1], int *currNumOfLines)
{
FILE* fp;
fp = fopen(argv[fileNumber], "r");
if (fp == NULL)
{
fprintf(stderr, MSG_ERROR_OPEN_FILE, argv[fileNumber]);
exit(EXIT_FAILURE);
}
char line[256];
while (fgets(line, sizeof(line), fp))
{
printf("\n line contains : %s size is : %lu\n",line,strlen(line));
}
}
该功能始终打印出正确的数字+ 2 ,
例如,如果file.txt仅包含"AAAAA"
的一行,则函数将打印长度为7
而不是5
line contains : AAAAA
size is : 7
有人知道错误在哪里吗?
答案 0 :(得分:4)
别忘了fgets
将换行符留在缓冲区中。
似乎您正在读取在Windows中创建的文件(其中换行符是两个字符"\r\n"
),而换行符仅为"\n"
。这两个字符也是字符串的一部分,将由strlen
进行计数。
我猜您正在非Windows系统中读取Windows创建的文件的原因是,对于以文本模式(默认)打开的文件,则读取和写入字符串的函数将 translate < / em>与操作系统有关的格式之间的换行符。
例如在Windows上,当编写纯"\n"
时,它将被翻译并实际写为"\r\n"
。读取时会发生相反的翻译("\r\n"
变成"\n"
)。
在具有简单"\n"
行尾的系统上(例如Linux或macOS),不需要翻译,并且"\r"
部分将被视为任何其他字符。
答案 1 :(得分:0)
printf("\n line contains : %s size is : %lu\n",line,strlen(line));
这是赠品
获得的输出
line contains : AAAAA size is : 7
预期产量
line contains : AAAAA size is : 7