C / String данные из файла в массив.Ошибка сегментации - PullRequest
0 голосов
/ 24 мая 2019

Я пишу программу, которая передает слова из текстового файла и помещает их в массив.Я также добавил отображение данных массива, чтобы увидеть, все ли в порядке, но я получаю ошибку сегментации после компиляции.

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

#include <stdio.h>

#define BUFFER 100

int main() {
    char tab[BUFFER];
    FILE *wp;
    wp = fopen("tab_file_b_words.txt", "r");
    if(wp == NULL)
    {
        printf("error/n");
        return -1;
    }
    int i;
    for(i=0; i<sizeof(wp); i++) {
        if(wp != NULL)
            fscanf(wp, "%s", &tab[i]);
        else 
            break;
        }
    printf("Content: \n");
    for(i = 0; i < BUFFER; i++) {
        if(tab[i] != NULL)
            printf("%s\n", tab[i]);
        else 
            break;
        }
    fclose(wp);
    return 0;
}

Ответы [ 3 ]

2 голосов
/ 24 мая 2019
  1. На данный момент у вас есть массив char

    , что вам нужно

       char tab[BUFFER]; --> char tab[BUFFER][SOME_LENGTH];
    

    И

       fscanf(wp, "%s", &tab[i]); --> fscanf(wp, "%s", tab[i]);
    
  2. %s ожидает null завершение char *, но вы передаете char.

        printf("%s\n", tab[i]);
    
  3. sizeof(wp) - размер указателя.

    for(i=0; i<sizeof(wp); i++)
    

    Что вам нужно, это

      while (1 == fscanf(wp, "%s", tab[i]))
      {
             ...
      }
    
1 голос
/ 24 мая 2019

Этот раздел:

for(i=0; i<sizeof(wp); i++) {
    if(wp != NULL)
        fscanf(wp, "%s", &tab[i]);
    else 
        break;
    }

Проблематично.

Во-первых, есть несколько проблем со строкой: fscanf(wp, "%s", &tab[i]); Это должно быть записано как: fscanf(wp, "%s", tab); //removed & and array notation.
В отличие от int или float типов переменных, имя вашего char массив (то есть tab) уже является указателем, указывающим на адрес переменной, что делает ненужным (и неправильным) использование адреса оператора (&).

Относится к вышесказанному ... (и вероятная причина ошибки сегментации.)
Поскольку определение tab относится к простому массиву char (char tab[BUFFER];), обозначение tab[i] относится только к ih byte (или char) массива, а не ко всему массиву.Из-за используемого спецификатора формата "%s" функция fscanf () ожидает char *, а не char, что делает tab правильным аргументом для использования.

Если вы хотите использовать массив строк, переменная должна быть создана как 2D массив символов:

#define NUM_LINES 100
#define LINE_LEN 80

int main() {
    char tab[NUM_LINES][LINE_LEN] = {{0}}; // zero initialized array of 
                                           // NUM_LINE strings
                                           // each of LINE_LEN-1 capacity

В операторе for(i=0; i<sizeof(wp); i++) {

sizeof(wp)

будет равно количеству байтов указателя wp, 32 или 64, в зависимости от целевой адресации вашего приложения.Это, вероятно, не то, что вы хотели.(или хотите.)

Рассмотрите другой подход:
Если вы работаете с текстовыми файлами, попробуйте использовать комбинацию while() и fgets () для чтения строк из файла.Затем вы можете обработать каждую строку на основе ее известного синтаксиса.
(В следующем примере для упрощенной иллюстрации используется массив char с одним измерением.)

char line[some_len];

wp = fopen(some_file_name, "r");
if(wp)
{
    while(fgets(line, some_len, wp))
    {
        // use line.  In this case, just print to stdout
        printf("%s\n", line);
    }
    fclose(wp);
}
0 голосов
/ 24 мая 2019

sizeof(wp) это проблема. sizeof возвращает длину типа в байтах, а не длину файла.

Если вы хотите получить размер файла , вам может помочь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...