У меня есть следующий бит кода (это пример кода, так что ничего особенного):
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
char buffer[9];
int fp = open("test.txt", O_RDONLY);
if (fp != -1) // If file opened successfully
{
off_t offset = lseek(fp, 2, SEEK_SET); // Seek from start of file
ssize_t count = read(fp, buffer, strlen(buffer));
if (count > 0) // No errors (-1) and at least one byte (not 0) was read
{
printf("Read test.txt %d characters from start: %s\n", offset, buffer);
}
close(fp);
}
int fp2 = open("test.txt", O_WRONLY);
if (fp2 != -1)
{
off_t offset = lseek(fp2, 2, SEEK_CUR); // Seek fraom current position (0) - same result as above in this case
ssize_t count = write(fp2, buffer, strlen(buffer));
if (count == strlen(buffer)) // We successfully wrote all the bytes
{
printf("Wrote to test.txt %d characters from current (0): %s\n", offset, buffer);
}
close(fp2);
}
}
Этот код не возвращает первую распечатку (чтение) в том виде, в каком она есть, а вторая распечатка гласит: «Написал test.txt 0 символов из текущего (0):», указывая, что он не выполнял поиск в любом месте файла и буфер пуст.
Странно, если я закомментирую все, начиная с fp2 = open("test.txt", O_WRONLY);
, первая распечатка вернет то, что я ожидал. Как только я включу второе утверждение open
(даже без ничего), оно не будет записано. Это как-то переупорядочивает открытые заявления или что-то еще?