gpt4 book ai didi

c - 这些系统调用有什么问题?

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:06 25 4
gpt4 key购买 nike

我无法调试这段代码。我从指南中复制了示例,此文件是否未正确编入索引?

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

char *inicio(void);

main(void)
{
char *c;
int fd, sz, i;
c = inicio();

fd = open("input.in", O_RDONLY);
if (fd < 0) { perror("r1"); exit(1); }

sz = read(fd, c, 10);
printf("We have opened input.in, and have called read(%d, c, 10).\n", fd);
printf("read has read %d bytes.\n", sz);
printf("The bytes are these: %s\n", c);

i = lseek(fd, 0, SEEK_CUR);
printf("lseek(%d, 0, SEEK_CUR) returns the current location on the file being %d\n\n", fd, i);

printf("We now look for the start of the file and call read(%d, c, 10)\n",fd);
lseek(fd, 0, SEEK_SET);
sz = read(fd, c, 10);

printf("The reading returns the following bytes: %s\n", c);

printf("We now execute lseek(%d, -6, SEEK_END). and return %d\n",fd, (int) lseek(fd, -6, SEEK_END));
printf("Executing read(%d, c, 10), we get the following bytes: ", fd);

sz = read(fd, c, 10);

printf("Finally, we execute lseek(%d, -1, SEEK_SET). This returns -1.\n", fd);
printf("perror() indicates the fault:\n");
fflush(stdout);

i = lseek(fd, -1, SEEK_SET);
perror("l1");
}

char *inicio(void)
{
char *bytes;
int j;
bytes = (char *) calloc(100, sizeof(char));
for(j=0;j<100;j++){bytes[j]=rand()%32+1;}
return bytes;
}

输入文件是:

 Jim Plank
Claxton 221

最佳答案

如果您从文件的开头寻找负偏移量,则会出现错误 - 在文件开头之前没有可访问的字节。

此外,您应该始终检查或捕获系统调用的结果,而不是依赖于 errno被设置。 C 库从不设置 errno为零(进程/线程启动时除外)。即使函数成功,它也可以设置为非零值。在 Solaris 上,它是 errno 的例程在写入文件后设置,因为该文件不是终端并且库尝试仅在终端上成功的操作。


工作代码,减去通过“malloc()”分配的内存。它明确地只打印读取的字符数(' <<%.*s>> ' 将长度限制为给定的大小;尖括号可以很容易地看到正在打印的数据)。

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

int main(void)
{
char c[100];
int fd, sz, i;

fd = open("input.in", O_RDONLY);
if (fd < 0)
{
perror("Error from open(\"input.in\", O_RDONLY)");
exit(1);
}

sz = read(fd, c, 10);
printf("Opened input.in (fd = %d)\n", fd);
printf("We called read(fd, c, 10) and read %d bytes: <<%.*s>>\n",
sz, sz, c);

i = lseek(fd, 0, SEEK_CUR);
printf("lseek(fd, 0, SEEK_CUR) returns the current offset of %d\n", i);

printf("We seek to start of the file and call read(fd, c, 10)\n");
i = lseek(fd, 0, SEEK_SET);
if (i != 0)
perror("Error from lseek(fd, 0, SEEK_SET)\n");

sz = read(fd, c, 10);
if (sz < 0)
perror("Error from read(fd, c, 10)\n");
printf("We read the following bytes: <<%.*s>>\n", sz, c);

printf("We now execute lseek(fd, -6, SEEK_END) which returns %d\n",
(int) lseek(fd, -6, SEEK_END));
printf("Executing read(fd, c, 10), we get the following bytes: ");

sz = read(fd, c, 10);
if (sz < 0)
perror("Error from read(fd, c, 10)\n");
printf("<<%.*s>>\n", sz, c);

printf("Finally, we execute lseek(fd, -1, SEEK_SET) which returns -1\n");
fflush(stdout);

if ((i = lseek(fd, -1, SEEK_SET)) < 0)
perror("Error from lseek(fd, -1, SEEK_SET)");
printf("i = %d\n", i);
return 0;
}

输出:

Opened input.in (fd = 3)
We called read(fd, c, 10) and read 10 bytes: <<Jim Plank
>>
lseek(fd, 0, SEEK_CUR) returns the current offset of 10
We seek to start of the file and call read(fd, c, 10)
We read the following bytes: <<Jim Plank
>>
We now execute lseek(fd, -6, SEEK_END) which returns 16
Executing read(fd, c, 10), we get the following bytes: <<n 221
>>
Finally, we execute lseek(fd, -1, SEEK_SET) which returns -1
Error from lseek(fd, -1, SEEK_SET): Invalid argument
i = -1

关于c - 这些系统调用有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3864729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com