1

我尝试使用系统调用 lseek() 来取回文件的开头或到达文件的结尾。

我使用的确切代码是:

int location = lseek(fd, 0, SEEK_SET) //get back to the beginning
int location = lseek(fd, 0, SEEK_END) //reach to the end

但是,在文件位置被重置后,每当我尝试使用 read() 时,read() 的返回值总是设置为 -1,这意味着有问题。此外,我收到的 errno 消息是错误的文件描述符。有谁知道我该怎么办?

PS:我试图关闭并重新打开文件以帮助我回到文件的开头并且它有效。但是我不知道如何在不使用 lseek() 的情况下到达文件末尾并以相反的顺序读取整个文件。

另外:一个可重复的例子是:

#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
    int fd;
    char buffer[1000];

    fd = creat("newFile", 0777);

    memset(buffer, 'a', 500);
    write(fd, buffer, 500); // fill up

    int location = lseek(fd, 0, SEEK_SET); //get back to the beginning

    int read_bytes = read(fd, buffer, 500);
    // this should return the bytes it reads but it actually returns -1
    printf("%d\n", read_bytes);
    return 0;
}
4

2 回答 2

4

creat功能不允许您从文件中读取。它只允许你写它。

来自creat(2)

creat()
调用 tocreat()等同于调用open()equal flagsto O_CREAT|O_WRONLY|O_TRUNC

这里的重要部分是O_WRONLY. 这意味着“只写”。

如果你想打开文件(并创建它)进行读写,那么你可以open像这样使用:

int fd = open("newFile", O_CREAT|O_RDWR|O_TRUNC, 0777);

这里的重要部分是O_RDWR. 这意味着“读和写”。
如果您想open在文件已存在的情况下给出错误,请添加O_EXCL标志;如果您尝试创建文件时文件已经存在,这将导致-1返回并errno设置为。EEXIST

于 2019-09-02T22:47:27.130 回答
0

以下建议的代码:

  1. 干净地编译
  2. 正确声明变量类型
  3. 正确创建文件
  4. 正确包含所需的头文件
  5. 正确检查来自 C 库函数的错误指示(并正确处理任何错误)

现在,建议的代码:

#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <string.h>
#include <unistd.h>

int main(void)
{
    int fd;
    char buffer[1000];

    // fd = creat("newFile", 0777);
    fd = open("newFile", O_CREAT|O_RDWR|O_TRUNC, 0777);
    if( fd < 0 )
    {
        perror( "open failed" );
        exit( EXIT_FAILURE );
    }

    memset(buffer, 'a', 500);
    write(fd, buffer, 500); // fill up

    off_t location = lseek(fd, 0, SEEK_SET); //get back to the beginning

    printf( "%ld\n", location );

    ssize_t read_bytes = read(fd, buffer, 500);

    if( read_bytes < 0 )
    {
        perror( "read failed" );
        exit( EXIT_FAILURE );
    }


    // this should return the bytes it reads but it actually returns -1
    printf("%ld\n", read_bytes);

    return 0;
}

运行程序会导致:

0
500

建议阅读/理解代码使用的任何 C 库函数的 MAN 页面

于 2019-09-04T02:51:46.750 回答