解决我必须将文件中的数据读入结构的问题。
文件的组织方式是有一个名称,几行ASCII艺术作品以#和等级结尾。这是一个例子
Sample Name
( S )
( S )
# 5
我的结构设置如下:
typedef struct
{
char* name;
char* art;
int rating;
}CASE;
我的问题是,当我尝试在下面的代码中为名称字符串动态分配内存时,我不断获得segmentation fault
:
/*FPin is file pointer to the txt file and all is the array of structs*/
void readFile(FILE* FPin, CASE** all)
{
CASE* walker = *all;
int count = 0;
char buffer[160];
char* bufferPtr = buffer;
char nameBuffer[100];
/*Reads in the name*/
while(fscanf(FPin, "%[^\n]", nameBuffer))
{
printf("string is %s\n", nameBuffer);
walker->name = (char*)malloc(sizeof(char)*(strlen(nameBuffer+1))); /*ERROR*/
strcpy(walker->name, nameBuffer);
}
return;
}
我记下了上述代码中我认为错误的位置,因为一旦我添加了该行,我就开始了解它。
我基本上是从文本中读取名称到nameBuffer(数组),然后使用strcpy将此名称复制到结构中。关于如何解决这个问题的任何建议?
感谢您的光临。
我将在下面提供我的其他资源:
int main (void)
{
CASE* all;
FILE* FPin;
if((FPin = fopen("art.txt", "r")) == NULL)
{
printf("Error opening file.");
exit(100);
}
allocateStructMem(&all);
readFile(FPin, &all);
fclose(FPin);
return 0;
}
void allocateStructMem (CASE** all)
{
if((*all = (CASE*)malloc(sizeof(CASE)*1000)) == NULL)
{
printf("Fatal memory error!\n");
exit(1);
}
return;
}
答案 0 :(得分:3)
<击>的strlen(nameBuffer + 1)击>
strlen(nameBuffer)+1
当你使用malloc all
:
int allocateStructMem(CASE **all)
{
/* +----- Note. And no need to cast as malloc returns (void *)
| */
if((*all = malloc(sizeof(CASE*) * 1000)) == NULL)
为防止溢出,您必须限制fscanf
的长度,即:
while (fscanf(FPin, "%99[^\n]", nameBuffer) == 1) {
1
确保您实际读取了nameBuffer中的内容。
strcpy
也没有填充 - 但你可能知道。
答案 1 :(得分:2)
在括号外移动+1会有帮助吗?
walker->name = (char*)malloc(sizeof(char)*(strlen(nameBuffer)+1)); /*ERROR*/