Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这两个字母之间有什么区别?_C - Fatal编程技术网

C 这两个字母之间有什么区别?

C 这两个字母之间有什么区别?,c,C,我称这些函数为: unsigned blah[5]; lseek(0, 100, SEEK_CUR); read(0, blah, sizeof(blah)); 及 我运行第一个代码运行这个命令: cat TEXTFILE | ./a.out ./a.out TEXTFILE 我运行第二个代码运行此命令: cat TEXTFILE | ./a.out ./a.out TEXTFILE 然而,我得到了不同的结果。虽然第一个搜索正确,所以它读取正确的文本,但第二个没有。我想使用第二种格式,

我称这些函数为:

unsigned blah[5];
lseek(0, 100, SEEK_CUR);
read(0, blah, sizeof(blah));

我运行第一个代码运行这个命令:

cat TEXTFILE | ./a.out
./a.out TEXTFILE
我运行第二个代码运行此命令:

cat TEXTFILE | ./a.out
./a.out TEXTFILE

然而,我得到了不同的结果。虽然第一个搜索正确,所以它读取正确的文本,但第二个没有。我想使用第二种格式,那么我做错了什么呢?

我不能百分之百地确定区别,但它似乎与管道与stdio/file有关。为了说明这一点,我制作了以下两个不同的测试程序:

考试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;
}
当我执行
cat./data.txt |./exam
时,输出为

01234
当我执行
/test./data.txt
时,我得到了

bcdef
bcdef
仅供参考,即使我们将
SEEK\u CUR
替换为
SEEK\u SET
,结果仍保持不变


但是,
/exam添加了一个
打开(仅文件名)调用第一个示例,这两个都对我很好。我怀疑你的问题是因为调用
lseek(0100,SEEK\u CUR),要求对标准输入进行搜索。如果您有以下情况,您不能总是在标准中寻找:

 cat file | ./my_program 
 ./my_program < file
然后,标准输入是fifo,您无法查找。如果在我的系统上执行此操作,seek将返回
-1
,并返回错误“非法seek”。这可能是您遇到的问题,您可能没有注意到,因为在您的示例中没有检查seek调用的返回值

请注意,如果您有:

 cat file | ./my_program 
 ./my_program < file
这里有两次处决:

 $ ./a.out < text
 Seek moved to this position: 100
 Seek said: Success
 Then read read 5 bytes
 The bytes read were '+++.-'
(这些字节是文件的前5个字节)


我还注意到,标准输入版本就是您所说的工作正常的版本。如果您在使用
文件*
版本时遇到问题,我怀疑
fopen()
调用失败,因此请确保检查
fopen()
中的返回值。当然,您始终可以这样做:

FILE *fr = stdin;  
所以你读的是《标准》杂志但是,由于您不能始终在中的标准上搜索,如果您计划搜索,我建议您始终打开一个文件。


请注意,您不能在所有可以打开文件的设备上搜索(尽管在大多数系统上不会出现问题),因此您应该始终检查
seek()
的结果,以确保搜索成功

SEEK\u CUR从当前位置开始。这就是为什么当您在文件的开头时,您的第一次搜索会起作用。要始终从一开始就搜索,您需要使用seek_SET而不是seek_CUR

0   SEEK_SET    The beginning of the file
1   SEEK_CUR    The current position
2   SEEK_END    The end of the file

如果将fseek与SEEK_SET一起使用,会发生什么?另外,作为检查,“read”返回多少read,fread返回多少read?也许您应该解释一下为什么要从文本文件中读取未签名的int。读取字符效果更好,strtol()可以转换。没有搜索,使用fgets()它返回多少是什么意思?您应该始终检查系统调用是否有错误。如果您这样做了,您就会知道您的
lseek()
失败,并将
errno
设置为ESPIPE(非法搜索)。我添加了一个答案,解释了管道和重定向之间的区别:)您可以(在这种情况下可以说应该)从
lseek()
检查返回状态,这将为您提供-1,并将
errno
设置为ESPIPE。@TimothyJones+1感谢您的解释!:D…我不知道stdin是不可见的不客气。请注意,它并不总是不可见的——只是有时,取决于它的提供方式。一般来说,我认为在stdin上寻找是不好的做法。
FILE *fr = stdin;  
0   SEEK_SET    The beginning of the file
1   SEEK_CUR    The current position
2   SEEK_END    The end of the file