将二进制文件中的数据存储到动态字符串数组中
Store data from binary file into dynamic array of strings
我有一个二进制文件,我以这种方式将数字存储为字符串:11 43 89 101 等
我想通过仅使用系统命令来读取存储的数字并将它们存储在字符串动态数组中,因为我不知道字符串最终会有多长或有多少。这是相关代码:
char **positions;
int all_names=0,i,j;
fd=open(argv[2],O_RDWR|O_CREAT,S_IRWXU);
i=0;
j=0;
do{
positions=(char**)malloc(sizeof(char*));
(*positions)[i]=(char*)malloc((MAX_SIZE+1)*sizeof(char));
do{
read(fd,positions[i][j],1);
}while(positions[i][j+1]!='[=10=]');
i++;
}while(i<all_names);
for(i=0; i<all_names; i++){
for(j=0; positions[i][j]!='[=10=]';j++){
printf("%c", positions[i][j]);
}
printf("\n");
}
}
所有名称都会跟踪二进制文件中的条目数量。
当我 运行 它时,我遇到了分段错误。我存储数字的部分工作正常我已经检查了文件。它总是存储数字和后面的 '[=12=]'
。
我收到此警告,但不知道如何解决
warning: incompatible integer to pointer conversion passing 'char' to parameter of type 'void *' [-Wint-conversion] read(fd,positions[i][j],1);
关于positions[i][j]
。
感谢您的帮助
编辑:将代码更改为:
char **positions;
int all_names=0,i,j;
positions=(char**)malloc(sizeof(char*));
*positions=(char*)malloc((MAX_SIZE+1)*sizeof(char));
fd=open(argv[2],O_RDWR|O_CREAT,S_IRWXU);
i=0;
j=0;
for(i=0; i<all_names; i++){
positions=(char**)realloc(*positions,(all_names) * sizeof(char*));
positions[i]=(char*)malloc((all_names+1)*sizeof(char));
for(j=0; ;j++){
read(fd,&positions[i][j],1);
if (positions[i][j] == ' ') {
break;
}
}
}
for(i=0; i<all_names; i++){
printf("%s\n", positions[i]);
}
}
现在我在 运行 时间收到错误消息:
malloc: * error for object 0x20400036: pointer being realloc'd was not allocated
* set a breakpoint in malloc_error_break to debug
Abort trap: 6
我真的认为我应该每次都重新分配,因为 all_names 值在我的代码的较早部分得到更新。我做错了什么?
您需要在阅读之后检查空字节,而不是之前。
read()
的第二个参数需要是指向数组元素的指针,使用&positions[i][j]
.
您必须为所有字符串分配内存,您只是在分配 positions
的一个元素。
positions = malloc(all_names * sizeof(char*));
fd=open(argv[2],O_RDWR|O_CREAT,S_IRWXU);
for(i=0; i<all_names; i++){
positions[i] = malloc((MAX_SIZE+1)*sizeof(char));
for(j=0; ;j++){
read(fd,&positions[i][j],1);
if (positions[i][j] == '[=10=]') {
break;
}
}
}
for(i=0; i<all_names; i++){
printf("%s\n", positions[i]);
}
您还需要将 all_names
设置为文件中的实际字符串数,而不是 0
。我不确定你从哪里得到的。
我有一个二进制文件,我以这种方式将数字存储为字符串:11 43 89 101 等
我想通过仅使用系统命令来读取存储的数字并将它们存储在字符串动态数组中,因为我不知道字符串最终会有多长或有多少。这是相关代码:
char **positions;
int all_names=0,i,j;
fd=open(argv[2],O_RDWR|O_CREAT,S_IRWXU);
i=0;
j=0;
do{
positions=(char**)malloc(sizeof(char*));
(*positions)[i]=(char*)malloc((MAX_SIZE+1)*sizeof(char));
do{
read(fd,positions[i][j],1);
}while(positions[i][j+1]!='[=10=]');
i++;
}while(i<all_names);
for(i=0; i<all_names; i++){
for(j=0; positions[i][j]!='[=10=]';j++){
printf("%c", positions[i][j]);
}
printf("\n");
}
}
所有名称都会跟踪二进制文件中的条目数量。
当我 运行 它时,我遇到了分段错误。我存储数字的部分工作正常我已经检查了文件。它总是存储数字和后面的 '[=12=]'
。
我收到此警告,但不知道如何解决
warning: incompatible integer to pointer conversion passing 'char' to parameter of type 'void *' [-Wint-conversion] read(fd,positions[i][j],1);
关于positions[i][j]
。
感谢您的帮助
编辑:将代码更改为:
char **positions;
int all_names=0,i,j;
positions=(char**)malloc(sizeof(char*));
*positions=(char*)malloc((MAX_SIZE+1)*sizeof(char));
fd=open(argv[2],O_RDWR|O_CREAT,S_IRWXU);
i=0;
j=0;
for(i=0; i<all_names; i++){
positions=(char**)realloc(*positions,(all_names) * sizeof(char*));
positions[i]=(char*)malloc((all_names+1)*sizeof(char));
for(j=0; ;j++){
read(fd,&positions[i][j],1);
if (positions[i][j] == ' ') {
break;
}
}
}
for(i=0; i<all_names; i++){
printf("%s\n", positions[i]);
}
}
现在我在 运行 时间收到错误消息:
malloc: * error for object 0x20400036: pointer being realloc'd was not allocated * set a breakpoint in malloc_error_break to debug Abort trap: 6
我真的认为我应该每次都重新分配,因为 all_names 值在我的代码的较早部分得到更新。我做错了什么?
您需要在阅读之后检查空字节,而不是之前。
read()
的第二个参数需要是指向数组元素的指针,使用&positions[i][j]
.
您必须为所有字符串分配内存,您只是在分配 positions
的一个元素。
positions = malloc(all_names * sizeof(char*));
fd=open(argv[2],O_RDWR|O_CREAT,S_IRWXU);
for(i=0; i<all_names; i++){
positions[i] = malloc((MAX_SIZE+1)*sizeof(char));
for(j=0; ;j++){
read(fd,&positions[i][j],1);
if (positions[i][j] == '[=10=]') {
break;
}
}
}
for(i=0; i<all_names; i++){
printf("%s\n", positions[i]);
}
您还需要将 all_names
设置为文件中的实际字符串数,而不是 0
。我不确定你从哪里得到的。