C-将数据读入结构数组memcpy? 为清晰起见,请编辑:

C-将数据读入结构数组memcpy? 为清晰起见,请编辑:,c,arrays,struct,C,Arrays,Struct,fscanf的工作方式与此处编写的方式相同……它将数据放入已损坏的数组中 为清晰起见,请进行另一次编辑: 唯一的故障点是循环第二次迭代中的memcpy行,其中fileindex为0,i为1。当i为0时,memcpy行工作正常 我正在将一个程序转换为从ascii文本读取,该程序使用fread直接从二进制文件读取数据,并将其转换为数组。以下是设置: #define MAX_FLIGHT_ENTRIES 27000 #define MAX_PLANES_IN_A_FLIGHT 10 type

fscanf
的工作方式与此处编写的方式相同……它将数据放入已损坏的数组中

为清晰起见,请进行另一次编辑: 唯一的故障点是循环第二次迭代中的
memcpy
行,其中
fileindex
为0,
i
为1。当
i
为0时,
memcpy
行工作正常


我正在将一个程序转换为从ascii文本读取,该程序使用
fread
直接从二进制文件读取数据,并将其转换为数组。以下是设置:

#define MAX_FLIGHT_ENTRIES    27000
#define MAX_PLANES_IN_A_FLIGHT 10

typedef struct {
    double local_x;
    double local_y;
    double local_z;
    float pitch;
    float roll;
    float heading;
    float gearpos;
    float flappos;
    float speedbrakepos;
    float canopypos;
    float afterburnerOn;
    float kias;
    float time;     // record timestamp
} FLIGHT_ENTRY_TYPE;
static FLIGHT_ENTRY_TYPE FlightEntries [MAX_PLANES_IN_A_FLIGHT][MAX_FLIGHT_ENTRIES];
在循环中,该方法的工作方式是通过以下方式填充阵列:

fread (&FlightEntries[fileIndex][i], sizeof (FLIGHT_ENTRY_TYPE), 1, pFile);
我相信这实际上会通过将数据直接放入内存来实例化数组中的每个条目。现在我从一个文本文件中读取数据,我已经尽我所能将这些值放入数组,但它只写入第一个条目FlightEntries[0][0]。任何读取或写入FlightEntries[0][1]的尝试都会崩溃。这是我目前最好的尝试

for ( i = 0; i < MAX_FLIGHT_ENTRIES; i++)
{               
        // If the file end is found before it should be, set values to defaults
        // and save the file
        if (feof(pFile))
        {
            FlightInfo[fileIndex].endFrameIndex = i - 1;
            break;
        }
        else
        {
            float plocalx, plocaly, plocalz;
            float ppitch, proll, pheading, pgearpos, pflappos, pbrakepos, pcanopypos, pafterburnon, pkias, ptime;
            
            int fresult;
            fresult = fscanf(pFile, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n",
                &plocalx,
                &plocaly,
                &plocalz,
                &ppitch,
                &proll,
                &pheading,
                &pgearpos,
                &pflappos,
                &pbrakepos,
                &pcanopypos,
                &pafterburnon,
                &pkias,
                &ptime);

                FLIGHT_ENTRY_TYPE newEntry;

            newEntry.local_x = (double)plocalx;
            newEntry.local_y = (double)plocaly;
            newEntry.local_z = (double)plocalz;
            newEntry.pitch = ppitch;
            newEntry.roll = proll;
            newEntry.heading = pheading;
            newEntry.gearpos = pgearpos;
            newEntry.flappos = pflappos;
            newEntry.speedbrakepos = pbrakepos;
            newEntry.canopypos = pcanopypos;
            newEntry.afterburnerOn = pafterburnon;
            newEntry.kias = pkias;
            newEntry.time = ptime;

            memcpy (&FlightEntries[fileIndex][i], &newEntry, sizeof FLIGHT_ENTRY_TYPE);
        }
}
用于(i=0;i
我认为数组项分配不正确。我尝试通过
FlightEntries[fileIndex][I]直接访问各个结构成员
我还尝试使用
memcpy
为每个成员做同样的事情……我的指针是做错了还是怎么了?我不知道该怎么办。每次我越过一个绊脚石,就会出现其他问题,我认为这都与数组有关,而不是从文件中读取。我必须做些什么来分配空间吗

最大的问题是:
fread
对FlightEntries[0][1]中的二进制数据做了什么
memcpy
没有做的事情?我的
memcpy
行是否正确?是否需要执行某种类型的
malloc

…用于使用fread将二进制文件中的数据直接读取到数组中。
编辑
现在我正在从一个文本文件中读取数据,我已经尽我所能将值放入数组。

除非您的文件内容与FLIGHT\u ENTRY\u TYPE结构的当前定义相匹配,或者与以下定义相匹配:

#define MAX_FLIGHT_ENTRIES    27000
#define MAX_PLANES_IN_A_FLIGHT 10
无论您尝试什么,您的阅读尝试都会出现问题。(文件内容和结构定义必须保持一致,才能执行您尝试执行的操作。因为您使用的是文本文件,所以这应该很容易验证。)

同样很少是读取文件的好选择

考虑将其更改为以下内容:(伪代码)

结构的前三个成员是
double
值,因此应该读入double值。如果您决定进行更改:

float plocalx, plocaly, plocalz; 
至:

double plocalx, plocaly, plocalz;
请务必同时更改

fresult = fscanf(pFile, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", 
fresult = fscanf(pFile, "%lf %lf %lf %f %f %f %f %f %f %f %f %f %f\n",  

fresult = fscanf(pFile, "%f %f %f %f %f %f %f %f %f %f %f %f %f\n", 
fresult = fscanf(pFile, "%lf %lf %lf %f %f %f %f %f %f %f %f %f %f\n",  
您还应该检查
sscanf()的返回值


返回值:根据formatString中的说明符,将指定源字符串中的输入转换为一系列值。如果在第一次转换之前发生输入故障,则函数返回EOF(-1);否则,该函数将返回指定的输入项目数。如果复制发生在重叠的对象之间,则行为未定义

编辑2
如果确实需要创建字符串数组(针对文件的每一行),这些函数将有助于:

char ** allocMemory(char ** a, int numStrings, int maxStrLen)
{
    int i;
    a = calloc(sizeof(char*)*(numStrings+1), sizeof(char*));
    for(i=0;i<numStrings; i++)
    {
      a[i] = calloc(sizeof(char)*maxStrLen + 1, sizeof(char));
    }
    return a;
}

void freeMemory(char ** a, int numStrings)
{
    int i;
    for(i=0;i<numStrings; i++)
        if(a[i]) free(a[i]);
    free(a);
}

//usage:
#define MAX_FLIGHT_ENTRIES    27000
#define MAX_PLANES_IN_A_FLIGHT 10
int main(void)
{
    char **stringArray = {0};
    stringArray = allocMemory(stringArray, MAX_PLANES_IN_A_FLIGHT, sizeof FLIGHT_ENTRY_TYPE);
    ...//read data into string array as shown in code above
    return 0;
}   
char**allocMemory(char**a,int numStrings,int maxStrLen)
{
int i;
a=calloc(sizeof(char*)*(numStrings+1),sizeof(char*);

对于(i=0;i可减轻未列出的情况


事实证明,由于我无法调试,我在循环迭代结束时放置了一个日志文件片段。我认为实例化日志文件会损坏数组并阻止数组写入。可能是堆问题,但我不确定。我也从这个练习中学到了很多关于取消内存指针的知识作为从文件中读取和写入数据的更好方法。谢谢大家的帮助。

与其填充临时结构实例,不如直接读取FlightEntries,因为您似乎不需要任何验证?
fre