c - 我需要将一个文件(现在是文本文件)拆分为多个缓冲区 C

标签 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

你有什么建议吗?

最佳答案

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

这一行有几个问题。

  • buffer[i] 只是一个未初始化的指针,指向任何地方。
  • *buffer[i] 的类型为 char,您需要传递 char*
  • strlen 未返回缓冲区的大小。这是未定义的行为,因为您通过未初始化的指针值调用了它。
  • fgets返回NULL时,取消对fgets返回的任何内容也是不好的。它会调用未定义的行为。

对此有很多解决方案,从动态内存分配到使用 字符缓冲区[大小][MAXSIZE];。如果您这样做,您可以通过以下方式获取输入:

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

关于c - 我需要将一个文件(现在是文本文件)拆分为多个缓冲区 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48387653/

相关文章:

c - 使用 libcurl 构建 SOAP 请求

c - 我必须在两个进程之间执行套接字通信,其中一个是守护进程

javascript - 带有文本文件和硬编码回调的跨域 JSONP

python - 具有阻塞请求的 Gevent 异步服务器

python - 如何在选择中正确使用超时参数?

sql-server - 在 iOS 上通过套接字编程连接到 SQL Server

java - 如何在 Android native C 中获取 APK signing 签名?

c - 将磁盘 block 读取为位图

java - 从文件中读取特定页面

c++ - 如何逐字读取文件并找到每个字的位置?