【问题标题】:Store data from binary file into dynamic array of strings将二进制文件中的数据存储到动态字符串数组中
【发布时间】:2019-11-25 17:15:13
【问题描述】:

我有一个二进制文件,我以这种方式将数字存储为字符串: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]!='\0');
            i++;
        }while(i<all_names);

        for(i=0; i<all_names; i++){
            for(j=0; positions[i][j]!='\0';j++){
                printf("%c", positions[i][j]);
            }
            printf("\n");
        }
    }

所有名称都会跟踪二进制文件中的条目数量。

当我运行它时,我遇到了分段错误。我存储数字的部分工作正常,我检查了文件。它总是存储数字和一个'\0'

我收到此警告,但不知道如何解决

警告:不兼容的整数到指针转换将“char”传递给“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: * 对象 0x20400036 的错误:未分配重新分配的指针 * 在 malloc_error_break 中设置断点进行调试 中止陷阱:6

我真的认为我应该每次都重新分配,因为 all_names 值在我的代码的早期部分得到更新。我做错了什么?

【问题讨论】:

  • 您似乎错过了分配内存来存储数据的重要步骤。
  • @RamblinRose 忘记在代码中显示了!编辑于。
  • 我不明白第一个for(j 循环。在读取任何内容之前,您正在检查 positions[i][j] 的值。
  • 你只为positions[0]分配了内存,对于all_names字符串是不够的。
  • 你不应该在循环中每次都分配positions

标签: c segmentation-fault binaryfiles dynamic-arrays


【解决方案1】:

您需要检查您阅读后的空字节,而不是之前。

read() 的第二个参数需要是指向数组元素的指针,使用&amp;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] == '\0') {
            break;
        }
    }
}

for(i=0; i<all_names; i++){
    printf("%s\n", positions[i]);
}

您还需要将all_names 设置为文件中的实际字符串数,而不是0。我不确定你是从哪里得到的。

【讨论】:

  • 我从代码的另一部分获取 all_names,它会为每个条目增加。所以这一直在变化。我应该在开头做positions=(char**)malloc(sizeof(char*));,然后在all_names 更新之后再做positions = (char**)realloc(*positions, all_names * sizeof(char*));
  • 它是如何不断变化的?您需要知道它是什么,以便循环知道何时停止。
  • 它更早地改变了。这样做是有道理的,因为条目不断被添加到 pos 文件中。但在此循环发生之前它会发生变化。
  • 我也不断收到这种警告。我应该忽略它吗??
  • 如果在循环之前设置,那么我的代码应该可以工作。我忘记将修复添加到read() 调用中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2021-08-17
相关资源
最近更新 更多