当我将 fd 指针用于 read() 或 write() 时,fd 指针会递增吗?如何控制递增?
Does a fd pointer get incremented when I use it to read() or write() AND how can the incrementation be controlled?
我正在尝试从文件中读取一行并 return 指向下一行开头的指针,但我不明白当我使用它读取 10 个字符时 fd 发生了什么一次。我只能使用读、写、打开和 malloc。
示例 file.txt(显式显示 \n
):
Sphinx of black quartz, judge my vow.\n
Pack my box with five dozen liquor jugs.\n
The quick brown fox jumps over the lazy dog.\n
main.c:
int fd = open("file.txt", O_RDONLY);
int fd2 = open("oneline.txt", O_CREAT | O_WRONLY);
char *buffer = (char *)malloc(sizeof(char) * 10);
read(fd, buffer, 10);
write(fd2, &buffer, 10);
1) fd
现在会指向 file.txt
的第 11 个字符和 fd2
在 oneline.txt
的 EOF 处吗?
续main.c示例:
int newline = 0, found = 0;
while(found == 0)
{
read(fd, buffer, 10);
for(int i = 0; buffer[i] != '\n' || i < 10; i++)
{
newline++;
if(buffer[i] == '\n')
found = 1;
}
}
如果 fd
指向 file.txt
中的第 41 个字符(while 循环 运行 4 次,'\n' 是第 38 个字符)。整数 newline
的值等于 38。
2) 如何让 fd 指向 '\n' 字符之后的第 39 个字符?
你说的是文件偏移量。对于你的第一个问题,是的,你对那个点的偏移量是正确的。对于第二个问题,您可以使用 lseek
将偏移量向后移动。要返回 2 个字符,您需要执行 lseek(fd, -2, SEEK_CUR)
.
我正在尝试从文件中读取一行并 return 指向下一行开头的指针,但我不明白当我使用它读取 10 个字符时 fd 发生了什么一次。我只能使用读、写、打开和 malloc。
示例 file.txt(显式显示 \n
):
Sphinx of black quartz, judge my vow.\n
Pack my box with five dozen liquor jugs.\n
The quick brown fox jumps over the lazy dog.\n
main.c:
int fd = open("file.txt", O_RDONLY);
int fd2 = open("oneline.txt", O_CREAT | O_WRONLY);
char *buffer = (char *)malloc(sizeof(char) * 10);
read(fd, buffer, 10);
write(fd2, &buffer, 10);
1) fd
现在会指向 file.txt
的第 11 个字符和 fd2
在 oneline.txt
的 EOF 处吗?
续main.c示例:
int newline = 0, found = 0;
while(found == 0)
{
read(fd, buffer, 10);
for(int i = 0; buffer[i] != '\n' || i < 10; i++)
{
newline++;
if(buffer[i] == '\n')
found = 1;
}
}
如果 fd
指向 file.txt
中的第 41 个字符(while 循环 运行 4 次,'\n' 是第 38 个字符)。整数 newline
的值等于 38。
2) 如何让 fd 指向 '\n' 字符之后的第 39 个字符?
你说的是文件偏移量。对于你的第一个问题,是的,你对那个点的偏移量是正确的。对于第二个问题,您可以使用 lseek
将偏移量向后移动。要返回 2 个字符,您需要执行 lseek(fd, -2, SEEK_CUR)
.