Взято из 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
при добавлении каждого вызова.