我不是 100% 确定差异,但它似乎与管道与标准输出/文件有关。为了说明这一点,我制作了这两个不同的测试程序:
考试.c
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char **argv)
{
char blah[5] = {0,};
/* we're using stdin instead of pipeline :( */
lseek(0, 100, SEEK_CUR);
read(0, blah, sizeof(blah));
printf("%c%c%c%c%c\n", blah[0], blah[1], blah[2], blah[3], blah[4]);
return 0;
}
test.c
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
void testA(const char *s)
{
int f = -1;
char blah[5] = {0,};
f = open(s, O_RDONLY);
if (-1 < f)
{
lseek(f, 100, SEEK_CUR);
read(f, blah, sizeof(blah));
}
printf("%c%c%c%c%c\n", blah[0], blah[1], blah[2], blah[3], blah[4]);
}
void testB(const char *s)
{
FILE *fp = NULL;
char blah[5] = {0,};
fp = fopen(s, "r");
if (fp)
{
fseek(fp, 100, SEEK_CUR);
fread(blah, 1, sizeof(blah), fp);
}
printf("%c%c%c%c%c\n", blah[0], blah[1], blah[2], blah[3], blah[4]);
}
int main(int argc, char **argv)
{
testA(argv[1]);
testB(argv[1]);
return 0;
}
然后我创建了一些测试数据。
数据.txt
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
当我执行cat ./data.txt | ./exam时,输出是
01234
当我执行./test ./data.txt时,我得到了
bcdef
bcdef
仅供参考,即使我们将SEEK_CUR 替换为SEEK_SET,结果也不会改变。
但是,./exam <./data.txt 会导致
bcdef
这是合法的。
我知道这不是一个可以接受的答案,但不知道为什么“0”会显示数据文件的内容,但我希望它能以某种方式有所帮助。