最近开始使用指针并创建了一个小脚本,可以将一些文本文件拼凑在一起。
然而,当我尝试调用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,确保它不会超出数组范围
任何有用的帮助! :)
答案 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);