我需要将文件(现在是文本文件)拆分成多个缓冲区C.

时间:2018-01-22 18:02:39

标签: c file sockets buffer fgets

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

#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

你有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

这一行有几个问题。

  • buffer[i]只是一个未初始化的指针。
  • *buffer[i]类型为char,您需要传递char*
  • strlen未返回缓冲区的大小。这是未定义的行为,因为你通过未初始化的指针值调用它。
  • fgets返回fgets时,同时取消任何NULL返回的内容都很糟糕。它调用未定义的行为。

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

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

答案 1 :(得分:0)

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

修复是分配:

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

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

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