在C语言中删除解析为二维字符数组(char**)的文件末尾的多余行

x4shl7ld  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(120)

我目前正在用C语言开发一个函数,它可以将文件解析为一个二维字符数组(char **),问题是我在末尾得到了一个额外的行,我不知道如何解决这个问题。
你能帮帮我吗?
ps:我的学校要求我使用getline()fopen()
下面是代码:

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

void my_free_word_array(char **word_array)
{
    size_t i = 0;
    if (!word_array) {
        return;
    }
    while (word_array[i] != NULL) {
        free(word_array[i]);
        ++i;
    }
    free(word_array);
}

ssize_t my_put_str_arr(char **arr, int fd)
{
    char cr = '\n';
    ssize_t count = 0;
    size_t i = 0;
    if (!arr)
        return -1;
    while (arr[i]) {
        count += write(fd, arr[i], strlen(arr[i]));
        count += write(fd, &cr, 1);
        i++;
    }
    return count;
}

void append_word_array(char ***array, char *line)
{
    size_t array_len = 0;
    while ((*array)[array_len] != NULL) {
        array_len++;
    }
    size_t len = strlen(line);
    if (line[len - 1] == '\n') {
        line[len - 1] = '\0';
    }
    (*array)[array_len] = strdup(line);
    (*array) = realloc((*array), (array_len + 2) * sizeof(char *));
    (*array)[array_len + 1] = NULL;
}

void fill_from_file(char ***array, FILE *file)
{
    char *line_buff = NULL;
    size_t line_buff_size = 0;
    ssize_t line_size = getline(&line_buff, &line_buff_size, file);
    while (line_size >= 0) {
        append_word_array(array, line_buff);
        free(line_buff);
        line_buff = NULL;
        line_size = getline(&line_buff, &line_buff_size, file);
    }
    free(line_buff);
}

char **my_load_file_to_word_array(const char *filepath)
{
    char **word_array = NULL;
    FILE *file = fopen(filepath, "r");
    if (!file) {
        return NULL;
    }
    word_array = malloc(sizeof(char *));
    if (!word_array) {
        return NULL;
    }
    word_array[0] = NULL;
    fill_from_file(&word_array, file);
    fclose(file);
    return word_array;
}

int main (int argc, char **argv)
{
    char **file = my_load_file_to_word_array(argv[1]);
    my_put_str_arr(file, 1);
    my_free_word_array(file);
    return 0;
}

下面是测试文件的内容(我添加了\n\0,以便于您查看):

My name is Saul.\n
I am Saul Goodman.\n
Better call Saul.\0

这是我得到的结果:

My name is Saul.
I am Saul Goodman. 
Better call Saul.
mmvthczy

mmvthczy1#

你的代码的“问题”是函数my_put_str_arr()打印了每一行的存储,后面跟着一个\n字符。如果你不想打印最后一行\n,你需要测试下一行是否存在。你可以如下修改你的循环:

while (arr[i]) {
    count += write(fd, arr[i], strlen(arr[i]));
    i++;
    if (arr[i]) {
        count += write(fd, &cr, 1);
    }
}

相关问题