Я пытаюсь поместить каждую строку файла в char *arr[].

Например, у меня есть такой набор файлов
arq.txt:

linha1
linha2
linha3
linha4
linha5
linha6
linha7
linha8
linha9
linha10

Я хочу сохранить linha1 в первой позиции из моего строкового массива, поэтому arr[0] = "linha1"
Чтобы попытаться получить этот результат, я закодировал следующее:

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

int main(){
    FILE *in_file  = fopen("arq.txt", "r"); 
    char singleLine[150];
    char* test[30];
    int i = 0;

    if (!in_file) 
    {   
        printf("Error! Could not open file\n"); 
        return 0;
    }

    while (!feof(in_file)){
        fgets(singleLine, 150, in_file);
        if (i == 0){
            test[0] = singleLine;
            puts(singleLine);
        }
        i++;
    }

    size_t length = sizeof(test)/sizeof(test[0]);
    printf("Size: %d", length);

    printf("Here: %s\n", test[0]);

    fclose(in_file);

    return 0;
}

Хотя в результате выводится неверное значение данных:

(puts): linha1
Size: 30
Here: linha10

Я попытался получить размер массива из содержимого внутри него, поэтому в этом случае, имея только один элемент, я должен был получить 1 вместо 30.

c
-1
Nilton Schumacher F 17 Сен 2021 в 16:04

2 ответа

Лучший ответ

В вашем коде test[0] - это указатель, который указывает на начальный элемент массива singleLine. Другими словами

 test[0] = singleLine;

Не «копирует» содержимое singleLine в test[0], а заставляет test[0] указывать на singleLine. Он не имеет связи с сохраненным значением в singleLine на тот момент.

При попытке распечатать содержимое ячейки памяти, на которую указывает test[0], оно всегда будет ссылаться на последнее значение, хранящееся в singleLine.

Теперь в вашем цикле while значение singleLine постоянно обновляется, а позже, когда вы пытаетесь распечатать значение после цикла, оно печатает последнее прочитанное значение, которое сохраняется в singleLine.

Это сказало,

  1. См. Почему «while (! Feof (file))» всегда неверно?
  2. Вам нужно выделить память для каждого элемента массива test, а затем скопировать (strcpy()) содержание, если вы хотите, чтобы значения сохранялись.
2
Sourav Ghosh 17 Сен 2021 в 13:27

Вы можете использовать что-то вроде этого

#include<bits/stdc++.h>
using namespace std;

int main() {
    vector <string> v;
    string line;    
    ifstream fin("arq.txt");
    while(getline(fin,line)){
        v.push_back(line);
    }
    cout<<v.size();
}
0
GOVIND DIXIT 17 Сен 2021 в 13:23