#c
#c
Вопрос:
У меня есть двоичный файл, помещенный в массив символов. Некоторая часть файла может быть связана с struct s1
. В зависимости от значения в struct1
, будет N
больше байтов, прежде чем можно будет назначить другое struct struct2
. Я хочу прочитать эти N байт в другой массив и передать их в другое место, но я не понял, как это сделать. Ниже приведена моя попытка.
#include <stdlib.h>
#include <stdio.h>
struct s1{
int x;
int y;
int N;
};
int main(){
FILE *fp;
fp = fopen("myfile.xyz", "rb");
fseek(fp, 0, SEEK_END);
int sz = ftell(fp);
fseek(fp, 0, SEEK_SET);
// Populate buffer
unsigned char buffer[sz];
fread(buffer, sz, 1, fp);
char *pos = (char*) buffer; // current pos pointer to file buffer
// map s1, starting at pos
struct s1 *s1 = (struct s1*) pos;
// extra code parsing of s1...
pos = sizeof(struct s1); // increment pointer to after struct
int N = 10; // should be read from s1 (i.e. it is not(!) a static number)
char *temp = (char*) malloc((N 1)*sizeof(char));
// assign temp to be N bytes, starting at pos...
// parse_temp(temp);
pos = N;
free(temp);
return 0;
};
Я попытался создать цикл for следующим образом для заполнения temp
:
for(int i=0; i<N; i ){
*temp[i] = (char *) (pos i); //both temp[i] and *temp[i]...
};
но ни одна из версий не компилируется. Также кажется, что этот подход сводит на нет идею простого сопоставления массива таким же образом, как для структуры, поскольку temp
это новый блок памяти, не использующий «указатель на необработанную память» — я надеюсь, что приведение структуры выполняется.
Я медленно учусь c
, так что это может быть тривиальный вопрос с правильными условиями поиска…
Комментарии:
1. Я почти уверен, что эта часть:
struct s1 *s1 = (struct s1*) pos;
… имеет неопределенное поведение из-за проблем с выравниванием.2. Да, вы правы. В моем полном коде, который я использую
#pragma pack(1)
, забыл добавить его в этот MWE. Но спасибо, что указали на это.3. Хорошо, так в чем именно заключается ваш вопрос?
4. Я бы хотел, чтобы мой массив символов
temp
был заполненN
байтами, начинающимися сразу послеs1
, предпочтительно указывая на ту же память, что иbuffer
. Таким же образом, как структура просто размещается в памяти. Если это невозможно, я бы не возражал, скопировав каждый байт изbuffer[sizeof(s1):sizeof(s1) N]
в новый массив.5. Массивы не указывают.
temp
это не массив (это указатель). Если вы хотите указатьtemp
наbuffer
, сделайтеtemp = buffer;
… илиtemp = pos;
или любую другую позицию, которую вы хотите.