当指向数组中的文件时,Coredump处于fread状态

时间:2012-11-13 00:04:46

标签: c fread coredump

最近开始使用指针并创建了一个小脚本,可以将一些文本文件拼凑在一起。

然而,当我尝试调用fputs时,我得到了coredump / segmentation错误。我怀疑这是因为文件指针的保存方式。我发现这些文件将它保存在一个数组中,并尝试稍后检索它。

FILE指针保存在结构中。有人立即发现我的错吗?我将非常感激!

结构:

typedef struct{
int listSize;
int listCapacity;
FILE *fileStream;
}FileList;

创建结构

FileList fileList;
fileList.listSize=0;
fileList.listCapacity=1;
fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE));

然后我通过调用

将结构添加到数组中
void addFile(FileList* list, FILE* file)
{
    list->fileStream[list->listSize]=*file;
}

然而,当我打电话

char* buffer[10];
size_t result=0;

result = fread(buffer,1,10,&fileList.fileStream[ii+currentGroupOffset]);
    fputs(*buffer,outPutFile);

它崩溃,我试图观察值ii + currentGroupOffset,确保它不会超出数组范围

任何有用的帮助! :)

3 个答案:

答案 0 :(得分:1)

您似乎想要一个动态分配的FILE*元素数组。你有:

FILE *fileStream;

可以将其视为FILE指针或FILE元素数组。但不是FILE指针的数组。为此,您需要:

FILE **fileStream;

分配数组应该完成:

fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE*));

FILE不是您直接使用的类型。你总是处理它的指针。你应该把它当作一种不透明的类型。

另外,我没有看到您在代码中的任何位置实际打开文件的位置(使用fopen())。

答案 1 :(得分:1)

为什么

char * buffer[10];

应该是

char buffer[10];

list->listSize在哪里递增?

我不明白这是什么

 fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE));
通过调用FILE *而不是通过分配内存

来初始化

fopen

答案 2 :(得分:1)

您无法自己分配和复制FILE结构 - 这是一种不透明的数据类型。因此,不是创建FILE结构数组,而是创建一个FILE *指针数组:

typedef struct {
    int listSize;
    int listCapacity;
    FILE **fileStream;
} FileList;

FileList fileList;

fileList.listSize = 0;
fileList.listCapacity = 1;
fileList.fileStream = calloc(fileList.listCapacity, sizeof fileList.fileStream[0]);

然后通过复制指针值为数组添加FILE *指针:

void addFile(FileList *list, FILE *file)
{
    list->fileStream[list->listSize] = file;
}

并像这样使用它:

char buffer[10];
size_t result = 0;

result = fread(buffer, 1, 10, fileList.fileStream[ii+currentGroupOffset]);
fwrite(buffer, 1, result, outPutFile);