Запись массива в файл на C?

Я работаю над проектом для университета, основная идея в том, что я хочу проверить, пуст ли файл.

void main() {

    FILE* file = fopen("stocksData.csv", "w+");

    fseek(file, 0, SEEK_END);
    unsigned long len = (unsigned long)ftell(file);
    if (len == 0) {  //check if the file is empty
        fclose(file);
        importCarStock();
    }
}

Если он пуст, я хочу, чтобы он вызывал эту функцию:

void importCarStock() {
    FILE* file = fopen("stocksData.csv", "w");
    fwrite(carStock, sizeof(char), sizeof(carStock), file);
    fclose(file);
    
}

И запишите этот массив в файл:

int carStock[10] = { 5, 7, 10 };

Но единственное, что он записывает в файл, это два небольших блока. Любая идея, что не так с этим? Заранее спасибо.

Открытие файла в режиме w+ очистит его. Используйте режим r.

Barmar 10.12.2020 23:33
5, 7, 10 — это коды ASCII чего-то, что может выглядеть как «два маленьких блока» в программе просмотра текста.
Eugene Sh. 10.12.2020 23:34

Ваша функция названа неправильно. Запись в файл — это экспорт, а не импорт.

Barmar 10.12.2020 23:34

Вы пишете двоичный файл. Если вы хотите написать файл CSV, вам нужно отформатировать числа. Используйте sprintf() или fprintf().

Barmar 10.12.2020 23:34

Вы хотите записать необработанные двоичные данные в файл? Или как текст? Прямо сейчас вы как бы смешиваете его, открывая файл в текстовом режиме, но записывая необработанные двоичные данные. В Интернете есть множество учебных пособий по вводу-выводу файлов, и любая приличная книга также должна содержать пару глав об этом. Я предлагаю вам потратить некоторое время, чтобы изучить немного больше.

Some programmer dude 10.12.2020 23:35

Кажется, Бармар прав. Я пытаюсь понять, как использовать fprintf прямо сейчас, это, кажется, решение.

Ben N 11.12.2020 00:05

«выясните, как использовать fprintf прямо сейчас». Возможно, в сочетании с циклом.

n. m. 11.12.2020 00:08
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
7
346
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

fwrite(carStock, sizeof(char), sizeof(carStock), file);

Это проблема. fwrite записывает двоичные данные. Если у вас есть массив { 5, 7, 10 }, то он будет записывать байты 05 00 00 00 07 00 00 00 0A 00 00 00 (предполагая систему с прямым порядком байтов). Вы видите 2 блока из-за байтов 05 и 07, которые являются управляющими символами (0 - нулевые символы, а 0A - перевод строки).

Вам понадобится петля for:

for (int i = 0; i < sizeof carStock / sizeof carStock[0]; i++)
    fprintf(file, "%d ", carStock[i]);

Если вы хотите вывести числа в файл, вам нужно решить, хотите ли вы видеть эти числа с помощью текстового редактора или шестнадцатеричного редактора. Если вы сохраняете их в виде текста, их легче увидеть в текстовом редакторе, таком как Блокнот, но чтение и запись требуют больше времени и более подвержены ошибкам, если преобразование строки в число (и наоборот) выполняется неправильно. Если вы сохраните их в двоичном виде, вы не сможете увидеть их в текстовом редакторе, вы просто увидите тарабарщину, потому что ваш текстовый редактор пытается интерпретировать двоичные данные как символы ASCII/Unicode, однако они занимают меньше места и работают быстрее и быстрее. легче читать и писать.

Вот байты файла, сгенерированного циклом for (вы можете проверить их с помощью шестнадцатеричного редактора):

35 20 37 20 31 30 20

А вот байты, интерпретируемые как текст:

5 7 10

Большое спасибо! Казалось, что это помогло, единственная проблема теперь в том, что он печатает кучу нулей после чисел до размера массива, но, по крайней мере, это работает.

Ben N 11.12.2020 00:50

Причина, по которой он печатает кучу нулей, заключается в том, что в вашем массиве больше элементов, чем вы его заполняете. Вы заполняете только 3 значения, но массив имеет 10 элементов. Цикл for, который я написал, записывает весь массив. Если вам нужны только некоторые значения (например, 3 в вашем примере), вам нужно будет отслеживать это число в другой переменной и заменять его в цикле for.

DarkAtom 11.12.2020 14:41

Другие вопросы по теме