Файловая программа - fseek не работает

У меня возникли проблемы с тем, чтобы эта функция fseek() работала в моем коде. Текст, который я написал, просто не начинается с того места, которое я указываю, и я не знаю, почему. Он должен начинать запись с \n и просто перезаписывать весь текстовый файл. Даже если я открою его с помощью a, он просто не пойдет туда, куда я командую через параметры.

   fclose(file);
    FILE *file_a = fopen("ex6.txt", "w");

    fseek(file_a, -1, SEEK_END);

    puts("Write text to add:");
    while((letter = getchar()) != '\n')
    {
        fputc(letter, file_a);
    };

Что случилось? Почему это не работает?


person Telmo Vaz    schedule 25.06.2013    source источник
comment
Если вам нужен конец файла, я предполагаю, что вы захотите передать 0 в fseek. -1 будет за 1 байт до конца.   -  person Dark Falcon    schedule 25.06.2013
comment
Вы пытаетесь вставить в файл ближе к концу, а не просто добавить в конец?   -  person Fred Larson    schedule 25.06.2013
comment
Извините, что информация утеряна. Я пытаюсь добавить текст, скажем, 2 символа до конца, так что представьте, что это содержимое моего файла: hello\0 Я хотел бы вставить информацию hell | o\0, перезаписать o\0 и поместить туда свой собственный тест, например да, и конечный продукт будет: черт возьми, да. Но это похоже на то, что fseek не соответствует тому, что я спрашиваю, даже если я помещу ссылку в положительные числа...   -  person Telmo Vaz    schedule 25.06.2013
comment
Какая у вас платформа? Может быть, это может быть связано? -› Реализациям библиотек разрешено не поддерживать SEEK_END (поэтому код, использующий ее, не имеет реальной стандартной переносимости). cplusplus.com/reference/cstdio/fseek   -  person dtmland    schedule 25.06.2013
comment
На самом деле я открыл в режиме w+ и теперь все хорошо. Похоже, он не поддерживает простые w или a. Спасибо за ответы, ребята. Это было очень полезно.   -  person Telmo Vaz    schedule 25.06.2013
comment
Режим записи обрезает любой существующий файл до нулевой длины.   -  person R.. GitHub STOP HELPING ICE    schedule 26.06.2013
comment
Чтобы расширить: w усекает файл (если он существует), fseek() позволит вам прыгать, как только вы начали помещать в него материал. a и a+ всегда пишут в конец файла. Как вы обнаружили, w+ сохраняет любой существующий контент, позволяя вам расширять/перезаписывать.   -  person TripeHound    schedule 19.03.2014


Ответы (1)


Переход к абсолютному значению работает только тогда, когда файл открыт в двоичном режиме. Когда он открыт в текстовом режиме, fseek() не может перейти к абсолютным позициям в файле, кроме 0 (начало файла), и попытка сделать это приведет к неопределенному поведению. Однако вы можете перейти к ссылкам в файле, возвращенном ftell(). Причина этого связана с обработкой определенных символов некоторыми операционными системами; некоторые реализации позволяют это, но POSIX не требует этого.

Я знаю, что вы решили проблему в комментариях, это просто для закрытия.

person Community    schedule 25.06.2013