Путаница в файловых операциях C - PullRequest
2 голосов
/ 14 марта 2012

Здесь у меня есть одно имя файла, и я хочу сначала создать этот файл. Я хочу оставить несколько байтов в файле, а затем я хочу записать данные. поэтому здесь в коде ниже я использовал fseek(pFile, 10, SEEK_SET). чем я пишу здесь "sam" в файле с 11-й позиции. и затем закройте файл и снова откройте 4 раза этот файл в режиме добавления и напишите «abc" в конце файла. итого, байты в example.txt составляют 25 байтов. поэтому данные файла выглядят так: ..........samabcabcabcabc. Но я не хотел "Сэм" в этом файле данных. Значит хочу всего 22 байта. Если я здесь не использую fputs("sam", pFile);, тогда он дает только 12 байтов, а данные файла выглядят как abcabcabcabc.

Я хочу вывод в файл типа ..........abcabcabcabc.

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

Мой пример кода здесь.

#include <stdio.h>

int main() {
    FILE * pFile;
    pFile = fopen("example.txt", "wb");
    fseek(pFile, 10, SEEK_SET);
    fputs("sam", pFile);
    fclose(pFile);
    append("example.txt");
    append("example.txt");
    append("example.txt");
    append("example.txt");
    return 0;
}

void append(char *file) {
    FILE * pFile;
    pFile = fopen("example.txt", "ab");
    fputs("abc", pFile);
    fclose(pFile);
}

1 Ответ

2 голосов
/ 14 марта 2012

С man fopen

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

Таким образом, вы не можете перезаписать sam, если хотите открыть файл в режиме добавления, как вы это делали в append()

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

Обходной путь должен использовать r+ открытиевключите режим в первый раз, переместите внутренний указатель, используя fseek, а затем напишите abc.После этого вы можете позвонить своему append как обычно

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