Вы помещаете размер файла в fileSize
, но затем выделяете только место для хранения int
, что sizeof(FileSize)
даст вам.
Эти две строки
fileContent = malloc(sizeof(fileSize));
processedFileContent = malloc(sizeof(fileSize));
должно быть (при условии, что вы будете воспринимать текст, который вы читаете, как строку):
fileContent = malloc(fileSize+1);
processedFileContent = malloc(fileSize+1)
и, прочитав содержимое файла, вы должны поставить '\ 0' в полеконец.
Тем не менее, я действительно не понимаю, чего вы пытаетесь достичь, используя strtok()
.Если вам нужно разделить только три компонента в каждой строке, вы можете сделать это намного проще, пока читаете файл, поскольку вы читаете его по одному символу за раз.
Если вы немного подробнее расскажете о том, что выпытаясь достичь, у нас может быть другой совет.
ОБНОВЛЕНИЕ ПОСЛЕ КОММЕНТАРИИ НИЖЕ
Вы должны сделать шаг назад и пересмотреть свою проблему, так как я подозреваю, что вы не понимаете 'не нужно хранить какую-либо строку вообще.Первое значение - это название месяца, которое может быть сохранено как целое число, второе - двойное (или число с плавающей запятой), третье выглядит как ' Dx ' с x , варьирующимся от 1 до4, снова это может быть целое число.Кажется, это имя датчика, поэтому я подозреваю, что его можно было бы кодировать целым числом, так как их наверняка будет конечное число.И четвертое явно другое целое число.
С диким предположением о значении этих полей ваша структура будет выглядеть примерно так:
struct val {
int month;
double value;
int sensor;
int var;
}
Теперь вы можете получить значения каквы переходите на один символ за раз или читаете целую строку и получаете оттуда значения.
Переход на один символ за раз не потребует дополнительного пространства, но приведет к увеличению длины программы (полной 'если'и' пока ').Чтение строки будет немного легче, но вам потребуется обработать максимальный размер строки.
Правильное структурирование функций вам очень поможет:
do {
if ((c = get_month(fp, &month)) != EOF)
if ((c = get_value(fp, &value)) != EOF)
if ((c = get_sensor(fp, &sensor)) != EOF)
if ((c = get_var(fp, &var)) != EOF)
measures = add_data(measures, month, value, sensor, var);
} while (c != EOF);
return measures
Где measures
может быть связанным списком или массивом ваших структур с изменяемым размером, и при условии, что вы перейдете на один символв то время.
Есть много других деталей, которые вы должны установить, прежде чем закончите, я надеюсь, что это поможет вам найти правильное направление.