как сделать basi c IO в файле в c? - PullRequest
0 голосов
/ 28 мая 2020

Не знаю, дублируется ли он, если да, отметьте его (нигде не нашел ответов).

Имея это:

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

int main (void) {

    FILE *fp = fopen("txt2", "r+"); // does not help a+ or w+
    fprintf(fp,"20");
    fseek(fp,1,SEEK_CUR);
    fprintf(fp,"19");

    for(char c;(c=getc(fp))!=EOF;)
        putchar(c);

    fclose(fp);
    return 0;
}

Невозможно записать в файл, и в конце просмотрите файл через putchar. как открыть файл для чтения, а также для чтения? (Я пробовал r+,w+,a+, не помогло). По-прежнему путают их различия (r+/w+ - оба позиционируются в начале файла, так что в чем различаются? Только a+ имеет смысл, так как только он записывает в конец (после всего остального) в файл).

Я не знаю, что режим (r / w) + дает какой-то эффект, поскольку никто еще не объяснил различия и варианты использования, но я изменил режим с r+ на w+ и смещение fseek:

FILE *fp = fopen("txt2", "w+");
...
fseek(fp,10,SEEK_CUR);

, но на выходе будет 2019 вместо 20 19. Значит ли это, что fseek обрезает пробелы? или почему не выводится желание?

а это

1 Ответ

1 голос
/ 28 мая 2020

Вам необходимо добавить вызов fflush() или fseek() ... между чтением и записью.

См. https://port70.net/~nsz/c/c11/n1570.html#7 .21.5.3p7

Когда файл открывается в режиме обновления («+» в качестве второго или третьего символа в приведенном выше списке значений аргументов режима), как ввод, так и вывод могут выполняться в связанном потоке. Однако за выходом не должен следовать вход без промежуточного вызова функции fflu sh или функции позиционирования файла (fseek, fsetpos или rewind), а за входом не должен следовать напрямую выход без промежуточного вызова функция позиционирования файла, если операция ввода не встречает конец файла. Открытие (или создание) текстового файла в режиме обновления может вместо этого открыть (или создать) двоичный поток в некоторых реализациях.

    fprintf(fp,"19");              // write

    rewind(fp);                    // follow rhe rules

    for(int c;(c=getc(fp))!=EOF;)  // read, make sure c is int
...