Я работаю над проектом для университета, основная идея в том, что я хочу проверить, пуст ли файл.
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 };
Но единственное, что он записывает в файл, это два небольших блока. Любая идея, что не так с этим? Заранее спасибо.
5, 7, 10
— это коды ASCII чего-то, что может выглядеть как «два маленьких блока» в программе просмотра текста.
Ваша функция названа неправильно. Запись в файл — это экспорт, а не импорт.
Вы пишете двоичный файл. Если вы хотите написать файл CSV, вам нужно отформатировать числа. Используйте sprintf()
или fprintf()
.
Вы хотите записать необработанные двоичные данные в файл? Или как текст? Прямо сейчас вы как бы смешиваете его, открывая файл в текстовом режиме, но записывая необработанные двоичные данные. В Интернете есть множество учебных пособий по вводу-выводу файлов, и любая приличная книга также должна содержать пару глав об этом. Я предлагаю вам потратить некоторое время, чтобы изучить немного больше.
Кажется, Бармар прав. Я пытаюсь понять, как использовать fprintf прямо сейчас, это, кажется, решение.
«выясните, как использовать fprintf прямо сейчас». Возможно, в сочетании с циклом.
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
Большое спасибо! Казалось, что это помогло, единственная проблема теперь в том, что он печатает кучу нулей после чисел до размера массива, но, по крайней мере, это работает.
Причина, по которой он печатает кучу нулей, заключается в том, что в вашем массиве больше элементов, чем вы его заполняете. Вы заполняете только 3 значения, но массив имеет 10 элементов. Цикл for
, который я написал, записывает весь массив. Если вам нужны только некоторые значения (например, 3 в вашем примере), вам нужно будет отслеживать это число в другой переменной и заменять его в цикле for.
Открытие файла в режиме
w+
очистит его. Используйте режимr
.