0

Столкнулся с пробелом в своих знаниях, мне нужно из libary.txt содержимое записать в массив Libary Код:

#include <iostream>
#include <fstream>
#include <list>
#include <cstring>

struct Book { char Name[50]; char Author[50]; char Puplicator[50]; char Janr[50]; };

char Libary[400]; void FillArr(std::fstream, char[]);

int main() {

std::fstream input(&quot;libary.txt&quot;); // Открыли поток для чтения из файла
setlocale(0, &quot;&quot;);

} void FillArr(std::fstream txt, char Libary[]) { Book book; while (!txt.eof()) { txt >> book.Name >> book.Author >> book.Puplicator >> book.Janr; } }

Вот такой "скелет" вроде как должен быть

  • Опять это издевательство — while (!txt.eof())... Что до чтения через >>, то учтите, что так читается только 1 (прописью: одно) слово. – Harry Feb 18 '23 at 09:41
  • Не особо понял что вы имеете в виду – Kabanikov Feb 18 '23 at 09:43

2 Answers2

0
#include <iostream>
#include <fstream>
#include <cstring>
#include <exception>
#include <stdexcept>

using namespace std;

struct Book {
    char Name[50];
    char Author[50];
    char Puplicator[50];
    char Janr[50];
};

const size_t libary_size = 400; // Размера массива лучше хранить в переменной
char Libary[libary_size];


void FillArr(fstream txt, char Libary[]) {
    Book book;
}

// Эта функция вовращает поток чтения файла и может выбросить исключение,
// если файл не найден
ifstream getFileReader(const string& file_path) {
    ifstream input(file_path);

    if (!input.is_open()) {
        throw invalid_argument("FILE NOT FOUND"s);
    }
    else {
        return input;
    }
}

// Читаем файл пока не кончится файл и пока есть место в массиве
void fileReader(ifstream input) {
    size_t counter = 0;

    while(!input.eof() && counter != libary_size) {
        Libary[counter] = input.get();
        ++counter;
    }

    input.close(); // Поток чтения следует закрыть
}

// Процедура проверки результата чтения
void printLiblrary() {
    for (size_t index = 0; index < libary_size; ++index) {
        cout << Libary[index];
    }
}

int main() {
    setlocale(0, "");

    // Вставить сюда свой путь к файлу
    const string file_path = "E:/testdir/file.dat"s; 

    try {
        fileReader(getFileReader(file_path));
    }
    catch (const exception& err){
        cout << err.what() << endl;
    }

    // Для проверки того, что всё записалось
    printLiblrary(); 

    return 0;
}
0

Немного подумав, сделал так и все работает) Также хочу сказать спасибо всем за помощь.

#include <iostream>
#include <fstream>
#include <list>
#include <cstring> 
#include <string>

struct Book { std::string Name; std::string Author; std::string Puplicator; std::string Janr; }; std::string filename = "расположение ФАЙЛА"; const int totalbooks = 10; Book Libary[totalbooks]; bool ParseFile(std::string filename); void EditBook(int, int); char sep = ';'; // используемый разделитель const int num = 4; // кол-во информационных элементов в строке

int main() { setlocale(0, ""); if (ParseFile(filename)) // загружаем и обрабатываем файл { std::cout << "Данные из файла были успешно загружены\n";

bool ParseFile(std::string filename) { bool result = true; std::ifstream in; // поток для чтения in.open(filename); // окрываем файл для чтения if (in.is_open()) // проверка на успешность открытия файла { std::string line; // определяем переменную для хранения строки int readcounter = 0; // кол-во обработанных строк while (getline(in, line)) // читаем в цикле все строки файла { int pStart = 0; // значение индекса начала элемента int pStop = 0; // значение индекса разделителя std::cout << line << std::endl; // выводим содержимое прочитанной строки if (sizeof(line) > 2) // проверка на минимум 3 разделителя { Book book; for (int i = 0; i < num; i++) { pStop = line.find_first_of(sep, pStart); if (pStop == -1) pStop = sizeof(line);

                switch (i)
                {
                case 0: book.Name = line.substr(pStart, pStop - pStart);
                    break;
                case 1: book.Author = line.substr(pStart, pStop - pStart);
                    break;
                case 2: book.Puplicator = line.substr(pStart, pStop - pStart);
                    break;
                case 3: book.Janr = line.substr(pStart, pStop - pStart);
                    break;
                }

                pStart = pStop + 1;

            }
            Libary[readcounter] = book;
            readcounter++;
        }
        if (readcounter &gt;= totalbooks)
            break;
    }

}
else
{
    result = false;
}
in.close();
return result;

}