lseek () возвращает 0, когда следует новый open () - PullRequest
0 голосов
/ 10 января 2010

У меня есть следующий бит кода (это пример кода, так что ничего особенного):

#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 (даже без ничего), оно не будет записано. Это как-то переупорядочивает открытые заявления или что-то еще?

Ответы [ 2 ]

5 голосов
/ 10 января 2010

Неправильная строка

ssize_t count = read(fp, buffer, strlen(buffer));

, вы берете strlen неинициализированного буфера.Вы, вероятно, захотите размер буфера примерно так:

ssize_t count = read(fp, buffer, sizeof buffer);

Вы должны убедиться, что буфер действительно содержит строку с нулевым символом в конце, когда вы печатаете его как единое целое.

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, sizeof buffer - 1);
    if (count > 0) // No errors (-1) and at least one byte (not 0) was read
    { 
       buffer[count] = 0;
0 голосов
/ 10 января 2010

Вы абсолютно уверены, что очищаете файл при каждом запуске?

Как написано, при первом запуске вы увидите только вторую распечатку, а во второй раз - первую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...