В чем разница между r + и a + в fopen? - PullRequest
0 голосов
/ 13 ноября 2018

Я не понимаю, в чем практическая разница между r + и a + в fopen в c. Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Взято из fopen man-страница

  • r Открыть текстовый файл для чтения.Поток располагается в начале файла.

  • r + Открыть для чтения и записи.Поток располагается в начале файла.

  • w Усечение файла до нулевой длины или создание текстового файла для записи.Поток располагается в начале файла.

  • w + Открыть для чтения и записи.Файл создается, если он не существует, в противном случае он усекается.Поток располагается в начале файла.

  • a Открыть для добавления (запись в конце файла).Файл создается, если он не существует.Поток располагается в конце файла.

  • a + Открыть для чтения и добавления (запись в конец файла).Файл создается, если он не существует.Начальная позиция файла для чтения находится в начале файла, но вывод всегда добавляется в конец файла.

Я решил привести пример для дальнейшего использования. Сначалавсего FILE * fp будет указателем на поток, а не фактическими данными файла на жестком диске. Так что, когда вызывается fopen, он вызывается в потоке, а не в файле. Просто имейте в виду, что один файл может иметьнесколько потоков.Что означает + (здесь также приемлемо b, т. Е. R + == rb), это просто «обновление». Это связано с тем, как система записывает данные в файл. Файл может быть записан либо в случае стирания, либо записив целом, или измените только те данные, которые изменились. Например, если нам нужно обновить «Сегодня понедельник» на «СЕГОДНЯ понедельник», либо мы очищаем предложение и записываем его снова. Но если мы ОБНОВЛЯЕМ, мы просто меняем o на O, от n до N, от a до A, от y до Y и от m до M.

В данном примере давайте предположим, что у нас есть пустой файл и мы вызываем (у меня есть весь код, если вы хотитечтобы взять и проверить себя)

int main() {
    FILE * fp;

    if(fp==NULL)
    {
        return -1;
    }

    fp = fopen("file.txt", "r+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10001);
    fflush(fp);
    fclose(fp);

    fp = fopen("file.txt", "r+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10002);
    fflush(fp);
    fclose(fp);

    fp = fopen("file.txt", "r+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10003);
    fflush(fp);
    fclose(fp);

    return(0);
}

Также на этот вопрос уже дан ответ здесь

Это даст нам файл типа:

Это тестовый билет 10003

, что нормально, потому что первый вызов записал

Это тестовый билет 10001

второйвызов изменился с 1 на 2, а третий вызов изменился с 2 на 3. Теперь, если мы изменим эти 3 вызова, как:

    fp = fopen("file.txt", "a+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10001);
    fflush(fp);
    fclose(fp);

    fp = fopen("file.txt", "a+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10002);
    fflush(fp);
    fclose(fp);

    fp = fopen("file.txt", "a+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10003);
    fflush(fp);
    fclose(fp);

Мы получим

Это тестовый билет 10001 Это тестовый билет 10002 Это тестовый билет 10003

при добавлении каждого вызова.

0 голосов
/ 13 ноября 2018

еще одна ссылка www.cplusplus.com

  • "r" читать: Открыть файл для операций ввода. Файл должен существовать.
  • "w" write: Создать пустой файл для операций вывода. Если файл с таким именем уже существует, его содержимое отбрасывается, и файл обрабатывается как новый пустой файл.
  • "a" append: Открыть файл для вывода в конце файла. Операции вывода всегда записывают данные в конец файла, расширяя его. Операции изменения положения (fseek, fsetpos, rewind) игнорируются. Файл создается, если он не существует.
  • "r+" чтение / обновление: открыть файл для обновления (как для ввода, так и для вывода). Файл должен существовать.
  • "w+" запись / обновление: создайте пустой файл и откройте его для обновления (как для ввода, так и для вывода). Если файл с таким именем уже существует, его содержимое отбрасывается, и файл обрабатывается как новый пустой файл.
  • "a+" append / update: открыть файл для обновления (как для ввода, так и для вывода) со всеми операциями вывода, записывающими данные в конец файла. Операции изменения положения (fseek, fsetpos, rewind) влияют на следующие операции ввода, но операции вывода перемещают позицию обратно в конец файла. Файл создается, если он не существует.
0 голосов
/ 13 ноября 2018

r+ откроет файл для чтения и записи.Это не удастся, если файл не существует.fseek может использоваться для чтения и записи в любом месте файла.

w+ откроет файл для чтения и записи.Он создаст файл, если файл не существует, и уничтожит и заново создаст файл, если файл существует.fseek может использоваться для чтения в любом месте файла.

a+ откроет файл для чтения и записи.Он создаст файл, если файл не существует.fseek может использоваться для чтения в любом месте файла, , но запись всегда будет добавляться в конец файла независимо от любых вызовов fseek.

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