Как читать файлы с языка C и сохранять их как строки в памяти, получать сохраненные строки и обрезать их до определенной длины? в linux формате LF

Я хочу подойти к строке как к массиву, обрезать ее до определенной длины и сохранить в двумерном массиве. Например, у меня есть 20 строк текстового файла. как этот "input.txt"

www.google.com
www.naver.com
kbphonemall.com
kbplant.com
k-bplus.com
kbpointreestore.com
kbprint.com
kbprism.com
kbprivatebanking.com
kbpstore.com
kbr9rtudaf5ppy.com
kbrafting.com
kbraille.com
kbrainbank.com
kbrainbow.com
kbrainc.com
kbrainglocal.com
kbrandexpo.com
kbrandingschool.com
kbrandmall.com

а затем я прочитал этот файл и попытался обрезать его в каждой строке, используя «\ n в качестве ключа. Например, если вы хотите вырезать четыре линии одновременно, вы должны сначала вырезать их до «kbplant.com». И усеченная строка выглядит так.

www.google.com\nwww.naver.com\nkbphonemall.com\nkbplant.com\n

и затем он будет сохранен в массиве указателей. как это

char *cutting[n];
cutting[0] = "www.google.com\nwww.naver.com\nkbphonemall.com\nkbplant.com\n"
cutting[1] = "k-bplus.com\nkbpointreestore.com\nkbprint.com\nkbprism.com\n"
.... more

Пока что это объяснение функций, которые я хочу реализовать, и я покажу вам код.

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

#define IPATH "input.txt"

int main(int argc, char *argv[]) {

    char *ListBuffer;
    int ListSize;

    FILE *InputFile = fopen(IPATH, "r");

    fseek(InputFile, 0, SEEK_END);
    ListSize = ftell(InputFile);

    ListBuffer = malloc(ListSize);
    memset(ListBuffer, 0, ListSize);

    fseek(InputFile, 0, SEEK_SET);
    fread(ListBuffer, ListSize, 1, InputFile);

    int count = 0;
    ListBuffer[ListSize] = '\0'; //add NULL word

    for (int i = 0; i <= ListSize; i++) {
        if (ListBuffer[i] == '\n') {
            count++;
            if (count == 4) {
                printf("c%d\n", i);
                count = 0;
            }
        }
        if (ListBuffer[i] == 0) {
            printf("c%d\n", i);
            count = 0;
        }
    }

    fclose(InputFile);
    free(ListBuffer);
    ListBuffer = NULL;
}

это мой код. Я использовал различные функции, такие как функция strcpy, функция strtok, функция memcpy и т. д., но реализовать нужную функцию было сложно. Есть ли лучший способ или алгоритм?

Если вам нужно больше объяснений, я отвечу на него быстро.

Я был бы признателен, если бы вы могли ответить. Хорошего дня.

похоже, что вы очищаете буфер размером N байт, а затем читаете в него N байтов, так что нет места для нулевого терминатора '\0'

mmixLinus 16.03.2022 10:00

Wonlf, струны обозначают свою длину с заканчивающимся нулевой символ. Это необычно, но возможно для читать нулевого символа. При сохранении строки ввода в виде строки (которая добавляет '\0') возникает проблема невозможности отличить прочитанное '\0' от добавленного. Возможно, обнаружьте этот случай и обработайте его как ошибку или используйте нестроковое решение.

chux - Reinstate Monica 16.03.2022 14:06

Wonlf ListBuffer[i] != 0 не будет ложным, если не будет прочитан нулевой символ. Код будет повторяться после ListSize. Лучше как for (int i = 0; i < ListSize; i++) {.

chux - Reinstate Monica 16.03.2022 14:09

Wonlf, Если в последнем линия файла отсутствует конечная '\n', например "kbrandmall.com" вместо "kbrandmall.com\n", что должен делать код? Обнаружить и исключить? Относитесь к этому так, как если бы оно заканчивалось на '\n'?

chux - Reinstate Monica 16.03.2022 14:13

@Wonlf не добавляйте код в комментарии, так как вы видите, что он нечитаем. Вместо редактировать ваш вопрос и все уточнения поставьте там

Jabberwocky 21.03.2022 06:11

@Jabberwocky Большое спасибо за ваш ответ. Я выслушал ваш ответ и изменил результат кода: c56 c112 c179 c233 c300 я хочу поместить в данные temp[0] = Listbuffer[0]~[56], temp[1] = Listbuffer[57]~[112]... еще что я должен делать?

Wonlf 21.03.2022 06:39

Наверняка это проблема: for (int i = 0; i <= ListSize; i++) -> for (int i = 0; i < ListSize; i++)

Jabberwocky 21.03.2022 06:41

Нет, цикл for должен доходить до 300. Если вы вернетесь к 299, вы не сможете найти индекс 233~300 \n, потому что вы не можете пропустить нулевой символ.

Wonlf 21.03.2022 06:49
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
8
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Непонятно, чего вы пытаетесь добиться в основном цикле, но проблем больше:

  • вы должны выделить один дополнительный байт, чтобы установить нулевой терминатор в ListSize:

    ListBuffer = malloc(ListSize + 1);

  • бесполезно устанавливать массив в 0 с помощью memset: выделение с помощью calloc(1, ListSize + 1) было бы более эффективным для этой цели, но, поскольку вы читаете содержимое в массив, сначала очищать его бесполезно.

  • fread может возвращать короткий счет, например, в текстовом режиме в устаревших системах преобразование последовательностей CR/LR в байты новой строки \n уменьшает количество прочитанных байтов:

      ListSize = fread(ListBuffer, 1, ListSize, InputFile);
      ListBuffer[ListSize] = '\0'; // set the null terminator
    

Другие вопросы по теме