【问题标题】:I need to split a file (for now text file) into multiple buffer C我需要将一个文件(现在是文本文件)拆分为多个缓冲区 C
【发布时间】:2018-01-22 18:02:38
【问题描述】:

我正在尝试读取一个文件并将该文件拆分为多个缓冲区。 这就是我想出的:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define PKT_SIZE 2048;
#define PATH "directory of some kind"

int main() {
    char filepath[200] = PATH;
    FILE *packet;
    int size = PKT_SIZE;
    char *buffer[size];
    int i=0; 

    //OPEN FILE

    if((packet = fopen(filepath, "r")) == NULL){        //I'm trying with a txt file, then i'll change it to 'rb'
        printf("Error Opening File\n");
        return -1;
    }

    //READ FILE

    while(*fgets((char *) *buffer[i], (int) strlen(buffer[i]), packet) != NULL) {  //read the file and cycling insert the fgets into the buffer i
        printf("Create %d buffer\n", i);
        i++;
    }

    fclose(packet);
    return 0;
}

现在,当我运行这个程序时,我得到一个 SIGSEGV 错误,我设法理解这个错误是明确的:

 *fgets((char *) *buffer[i], (int) strlen(buffer[i]), packet) != NULL

你有什么建议吗?

【问题讨论】:

  • 您可能应该坚持使用char* filepath = PATH,因为使用固定长度的缓冲区,要么浪费大,要么太小并且有问题。
  • 声明:char *buffer[size]; 将声明一个大小为 2048 的字符指针数组。我认为您真正想要的是一个大小为 2 的 2048 个字符的数组。所以,也许你的声明应该是这样的:char[2][size];

标签: c file sockets buffer fgets


【解决方案1】:
*fgets((char *) *buffer[i], (int) strlen(buffer[i]), packet)

这一行作为几个问题。

  • buffer[i] 只是一个未初始化的指针,不指向任何地方。
  • *buffer[i]char 类型,您需要传递 char*
  • strlen 没有返回缓冲区的大小。这是未定义的行为,因为您在未初始化的指针值上调用它。
  • fgets 返回NULL 时,无论fgets 是什么返回都是不好的。它会调用未定义的行为。

有很多解决方案,从动态内存分配到使用 char buffer[size][MAXSIZE];。如果你这样做,你可以通过这种方式获得输入:

#define MAXSIZE 100
...
char buffer[size][MAXSIZE];
while(fgets(buffer[i], sizeof(buffer[i]), packet)!=NULL){...

【讨论】:

    【解决方案2】:

    char* buffer[size] 是一个由 N 个char* 指针组成的数组,这些指针未初始化。您必须在使用它们之前为它们分配内存,否则您的程序将在火球中爆炸。

    解决方法是分配:

    for (size_t i = 0; i < size; ++i) {
      buffer[i] = malloc(PKT_SIZE);
    }
    

    你也要对未来的记忆负责,所以以后别忘了free

    分配任意数量的缓冲区非常浪费。通常最好使用某种简单的链表类型结构并根据需要附加块。这样可以避免无意义的内存过度分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      相关资源
      最近更新 更多