Как C хранит информацию в файл на самом деле? - PullRequest
0 голосов
/ 24 февраля 2019

В приведенном ниже простом коде я записываю целое число (10) в файл, а затем читаю его обратно, чтобы убедиться, что оно успешно выполнено.Однако, когда я открываю файл (пробовал notepad ++ и vscode), я вижу что-то вроде этого:


???

Вот код:

int main(){

    int var = 10;
    FILE* fp = fopen("testfile","w");
    rewind(fp);
    fwrite(&var,sizeof(int),1,fp);

    fflush(fp);
    fclose(fp);

    int var2 = 0;

    fopen("testfile","r+");
    fread(&var2,sizeof(int),1,fp);

    printf("num: %d\n",var2);

return 0;
}

Конечно, я подумал, что, возможно, он написан наспециальный формат, который vscode не может распознать, но недавно я научился кодировать простую базу данных, и он использовал точно такой же способ для сохранения записей в файлах, и когда вы открывали его выходной файл с помощью vscode, он показывал оба ??? s Иинформация, однако, здесь показывает только БЕЗ информации.Так что, хотя это кажется очень простой проблемой, я не могу найти ответ на нее, так как же на самом деле хранится 10 в этом файле?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Когда вы записываете в файл с помощью fwrite, он читает необработанные байты, составляющие var, и записывает их на диск.Это двоичное представление числа.

Если вы используете такой инструмент, как od, он распечатает байты, содержащие файлы:

[dbush@db-centos7 ~]$ od -tx1 testfile 
0000000 0a 00 00 00
0000004

Здесь вы можете видеть, что первый байт содержит значение 10, а следующие 3 содержат значение 0. Это говорит нам о том, что int занимает 4 байта и хранится в формате с прямым порядком байтов, то есть младший значащий байт идет первым.

Если бы вместо этого вы использовали fprintf для записи значения:

fprintf(fp, "%d\n", var);

Это записало бы текстовое представление в файл.Файл будет выглядеть примерно так:

[dbush@db-centos7 ~]$ cat testfile 
10
[dbush@db-centos7 ~]$ od -tx1 testfile 
0000000 31 30 0a
0000003

Здесь мы видим, что при печати файла отображается читаемый текст, а od показывает нам коды ASCII для символов '1' и '0',а также перевод строки.

0 голосов
/ 24 февраля 2019

Вы пишете двоичный файл .Это не может быть прочитано с редактором.Значение 10, вероятно, хранится как 0x0000000A или 0x0A000000, что-то в этом роде, в зависимости от того, является ли система большим или маленьким порядковым номером.

Но дело в том, что оно хранится в двоичном формате, а нетекстовый формат.

Если вы откроете этот файл в текстовом редакторе, он, вероятно, будет интерпретирован как три символа NULL, а затем символ LF (перевод строки).

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