这个lseek,fseek,读,弗雷德有什么区别?[英] Whats the difference between this lseek, fseek, read, fread?

本文是小编为大家收集整理的关于这个lseek,fseek,读,弗雷德有什么区别?的处理方法,想解了这个lseek,fseek,读,弗雷德有什么区别?的问题怎么解决?这个lseek,fseek,读,弗雷德有什么区别?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我称这些功能:

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

FILE *fr;
fr = fopen(arg[1], "r");
unsigned blah[5];
fseek(fr, 100, SEEK_CUR);
fread(blah, 1, sizeof(blah), fr);

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

cat TEXTFILE | ./a.out

我运行第二个代码我运行此命令:

./a.out TEXTFILE

但是,我的结果不同.虽然第一个寻求正确,因此它读取正确的文本,但第二个文本不是.我想使用第二种格式,所以我做错了什么?

推荐答案

在第一个示例中添加open(filename,O_RDONLY);呼叫open(filename,O_RDONLY);对我来说都很好.我怀疑您的问题是因为呼叫lseek(0, 100, SEEK_CUR);,它要求寻求标准输入.如果您有:

 cat file | ./my_program 

然后,标准输入是FIFO,您无法寻求.如果我在系统上执行此操作,请通过返回-1来寻求失败,而"非法寻求"错误.这可能是您遇到的问题,您可能不会注意到,因为您不检查示例中的搜索电话的返回值.

请注意,如果您有:

 ./my_program < file

然后,标准输入是一个文件,您可能会寻找.在我的系统上,寻求返回100,输出是正确的.


这是您可以用来说明返回值的程序:

int main(void){ 

  int fd = 0;
  char blah[5];
  printf("Seek moved to this position: %d\n",lseek(fd, 100, SEEK_CUR));
  perror("Seek said");
  printf("Then read read %d bytes\n",read(fd, blah, sizeof(blah)));
  printf("The bytes read were '%c%c%c%c%c'\n",blah[0],blah[1],blah[2],blah[3],blah[4]); 
}                       

这有两个执行:

 $ ./a.out < text
 Seek moved to this position: 100
 Seek said: Success
 Then read read 5 bytes
 The bytes read were '+++.-'

(这些是该文件中位置100的正确字节)

$ cat text | ./a.out 
Seek moved to this position: -1
Seek said: Illegal seek
Then read read 5 bytes
The bytes read were '# def'

(这些字节是文件的前5个字节)


我还注意到标准输入版本是您所说的正确工作的版本.如果您在FILE *版本上遇到麻烦,我怀疑fopen()呼叫失败,因此请确保从fopen()中检查返回值.当然,您可以随时执行此操作:

FILE *fr = stdin;  

使您正在从标准中读取.但是,由于您不能总是在标准中寻求,因此建议您始终打开文件.

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

其他推荐答案

我对差异并不确定100%,但似乎与管道与stdio/file有关.为了说明这一点,我制作了这两个不同的测试程序:

考试

#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;
}

然后我创建了一些测试数据.

data.txt

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

当我执行cat ./data.txt | ./exam时,输出为

01234

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

bcdef
bcdef

仅供参考,即使我们用SEEK_SET替换SEEK_SET.

,结果仍然保持不变.

但是,./exam <./data.txt导致

bcdef

合法的.

我知道这不是一个可以接受的答案,而不知道为什么" 0"提出了数据文件的内容,但我希望它能以某种方式有所帮助.

其他推荐答案

SEEK_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

本文地址:https://www.itbaoku.cn/post/359412.html