Как считать массив структур из файла си
и сохранить каждое значение в массиве. Есть еще кое-что для этой конкретной проблемы (другие функции пока закомментированы), но это то, что действительно доставляет мне неприятности. Я часами смотрел на предыдущий вопрос о данных и массивах, но не могу найти, где я делаю ошибку.
и вот мой вывод:
Спасибо за ваше время.
Решение
Проблема в том, что вы объявляете местный grades массив размером 1, скрывающий глобальный grades массив. Мало того, вы теперь получаете доступ к массиву за пределами, так как локальный grades массив может содержать только 1 элемент.
Так что избавьтесь от строки:
Тем не менее, следует отметить, что это:
недопустимый синтаксис C ++. Вы просто наткнулись на это по ошибке, но этот код не скомпилируется, если скомпилирован с использованием строгого компилятора ANSI C ++.
Массив в C ++ должен быть объявлен с использованием константного выражения для обозначения количества записей в массиве, а не переменной. Вы, случайно, используете нестандартное расширение компилятора под названием Массивы переменной длины или VLA для краткости.
Если это для школьного задания, не объявляйте массивы таким способом (даже если вы хотели это сделать), так как это официально не C ++. Если вы хотите объявить динамический массив, это то, что std::vector для.
Другие решения
Я не вижу проблем с чтением файла, вы только что перепутали глобальную переменную с локальной переменной
Тебе это не нужно
Внутри функции readData
Ваш оригинальный глобальный массив grades размером 22, заменяется локальным массивом с тем же именем, но размером 0.
(Он не перезаписывается, просто любой код, использующий переменную grades внутри объема, который был определен второй, будет читать значение второго grades массив, так как он имеет более высокий приоритет.)
И то и другое inFile >> grades[i]; а также cout << grades[i] << " "; должен возвращать ошибки времени выполнения, когда вы читаете за пределами их размера (похоже, вы не используете строгий компилятор).
[ int grades[i]; обычно возвращает ошибку времени компиляции, поскольку вы не должны / обычно не можете инициализировать фиксированный массив переменной]
Я думаю, что вместо сбоя вашей программы происходит то, что grades[i] просто возвращает анонимный экземпляр переменной со значением 0, отсюда и ваш вывод.
Я делаю программу под названием «Диспетчер книг», теперь нужно создать функции для сохранения и загрузки книг (структур) из файла. Мне интересно, как их читать. Вот мое определение структуры:
Я сделал функцию, которая позволяет мне читать одну книгу из файла, но это ужасно, и я не понимаю, как читать книги. Я хочу прочитать это в мой массив.
Пример файла, который я хочу прочитать из внешности:
Редактировать: это то, что я пытался сделать, чтобы прочитать простую Книгу (в начале профессор сказал, что этого будет достаточно). Не совершайте самоубийство, читая это.
Чтобы ответить, как читать каждую строку, разделенную запятыми, вы должны сделать следующее:
Это будет читать только одну строку, но вы можете поместить ее в цикл и обрабатывать эти данные по одной строке за раз по мере необходимости. Это может быть не самый быстрый способ сделать это, но это довольно просто, если вы знаете формат для каждой строки.
Как насчет названий книг с , в них? Возможно, вам лучше использовать библиотеку для разбора CSV. Если вы используете такую библиотеку, как необходимо поместить " вокруг любого поля, содержащего , , прежде чем записывать его в текстовый файл, чтобы анализатор CSV мог его обработать.
Вы можете использовать двоичный файловый ввод / вывод, используя структуры fread () / fwrite () напрямую. Вы должны будете использовать структуру фиксированного размера. Ниже приведен простой пример. Он не выполняет всю необходимую проверку ошибок, но этого должно быть достаточно, чтобы начать работу.
Вы можете использовать следующий пример для чтения структур из файла в C:
Измените определение вашей книги на:
А затем в loadBook:
Вот как я решил свою проблему, используя код Chimera.
И моя функция письма:
Спасибо за помощь.
OP хочет прочитать строку текста, разделенного запятыми, в пользовательский struct .
Настоятельно рекомендуем отделить чтение от разбора.
Затем проанализируйте строку и верните значение, обозначающее 1: успех, 0: сбой или конец файла: EOF
Теперь разбираем buffer[] . Существует много подходов с различными плюсами и минусами. Следующее активно использует "%n" для сохранения смещения сканирования до этой точки.
strdup() - это распространенная, но нестандартная функция, которая выделяет память и дублирует строку. Пример кода Обязательно освободите выделенное пространство, когда закончите с book .
Примеры использования средств C++ для работы с файлами
В теме приводятся примеры использования файловой системы C++ для:
- чтения информации из файлов;
- записи информации в файлы.
Содержание
- 1. Функция, читающая строки из клавиатуры и записывающая их в файл
- 2. Функция, которая читает текстовый файл и выводит его содержимое на экран
- 3. Пример бесформатного ввода/вывода. Копирование одного файла в другой
- 4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()
- 5. Пример функции записывающей структурную переменную в файл
- 6. Пример чтения структурной переменной из файла
- 7. Пример чтения/записи массива структур в файл. Функции write() , read()
- 8. Пример записи/чтения массива чисел типа double
- 9. Пример чтения из файла строк. Функция getline()
- 10. Пример чтения строк из файла. Функции getline() + eof()
Поиск на других ресурсах:
1. Функция, читающая строки из клавиатуры и записывающая их в файл
Результат работи программы:
2. Функция, которая читает текстовый файл и выводит его содержимое на экран
Функция Example2() читает содержимое файла filename , имя которого есть входящим параметром функции.
3. Пример бесформатного ввода/вывода. Копирование одного файла в другой
В примере реализована функция Example3() , которая выполняет копирование файлов в двоичном (бинарном) формате. Функция получает два параметра. Первый параметр типа const char* есть имя файла-источника. Второй параметр типа const char* есть имя файла-назначения.
Функция реализует посимвольное копирование. Для получения символа из файла-источника используется функция get() .
Вызов функции Example3() из функции main() может быть следующим:
4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()
Функция Example4() из данного примера работает также как и предыдущая, только вместо вывода в поток << используется функция put() . Также, с помощью функции is_open() выполняется проверка на корректность открытия файла.
5. Пример функции записывающей структурную переменную в файл
По данному примеру можно реализовывать собственные функции, которые будут записывать структуры или классы в файл.
Реализована функция Example5() , которая выполняет запись структурной переменной типа BOOK в файл, имя которого есть входящим параметром. Функция Example5() использует функцию write() для записи. Файл открывается в двоичном формате ( ios::binary ).
6. Пример чтения структурной переменной из файла
Данный пример есть продолжением предыдущего примера из пункта 5. В примере в функции Example6() заполняется значение структурной переменной типа BOOK . Полученное значение формируется как входящий параметр-ссылка на тип BOOK . Также функция получает параметром имя файла для чтения. Для чтения структурной переменной используется функция read() .
Результат работы программы
8. Пример записи/чтения массива чисел типа double
- запись в файл массива M чисел типа double функцией write() ;
- чтение из файла массива чисел типу double функцией read() .
Файл открывается в двоичном формате.
Результат работи программы:
9. Пример чтения из файла строк. Функция getline()
10. Пример чтения строк из файла. Функции getline() + eof()
В примере реализована функция Example10() , которая выполняет чтение строк из файла. Файл открывается в текстовом формате. Имя файла задается входящим параметром функции. Определение конца файла выполняется с помощью функции eof() .
Добрый день! В этой статье я расскажу о том, как написать программу, которая будет считывать строки из файла. Покажу как записать их в массив или вывести. При написании программы будут использоваться функции из стандартной библиотеки языка C++.
Стандартная библиотека языка C++ <fstream> включает множество функций для работы с файлами. Описание функций можно найти в сети или в учебниках по C++. Здесь же я опишу одну, которая позволит произвести чтение строки из файла.
Содержание файла strings.txt
Три строки, содержащиеся в файле, я запишу массив и выведу на экран.
Пингвин читает содержимое файла
Переходим к написанию программы на C++.
Нашей программе понадобятся два заголовочных файла <iostream> и <fstream>. Первый нужен будет для использования вывода на консоль, второй для работы с файлами.
Объявим две целочисленные константы len и strings, они будут хранить максимальную длину наших строк и количество строк. Объявим символьную константу ch, которая будет хранить разделяющий символ. Первые две константы будут использоваться для объявления массива. Мой файл содержит 3 строки
При помощи значений двух первых констант объявим двумерный массив символов.
Создадим объект класса ostream, в конструктор поместим адрес файла, флаги открытия.
Флаг ios::in позволяет открыть файл для считывания, ios::binary открывает его в двоичном режиме.
Далее стоит проверить открылся ли файл, если не открылся, то завершаем работу программы.
В данный момент программа имеет такой вид
Теперь остается описать алгоритм считывания строк из файла и занесения их в массив с последующим выводом. Для этого понадобится цикл от нуля до strings с инкрементом переменной r. Во время каждого прохода цикла используем перегруженную функцию getline() объекта fs с тремя аргументами.
fs.getline(Массив_символов, Макс_длина_строки, Разделитель_строк)
Функция считывает символы из файла, пока не считает количество равное Макс_длина_строки, либо не встретит на своём пути символ равный Разделитель_строк, а после записывает считанные символы в Массив_символов. В качестве разделителя в моём текстовом файле используется перенос строки.
После сразу же выводим содержимое строки, хранящееся в массиве, при помощи поточного вывода в консоль cout.
Весь листинг конечной программы
За счет константных переменных её можно легко модернизировать. Изменив константу strings, можно указать количество выводимых строк. Чтение из файла будет производится до тех пор, пока массив не заполнится нужным количеством строк. Изменив константу ch, можно изменить разделитель строк(Например, можно разделять их пробелом и занести в массив отдельные слова из файла и т.д.).
Если Вас интересует запись в файл, то почитайте статью о чтении из input.txt и записи данных в файл output.txt.
Пример работы string и пример считывания всех строк из файла в массив с последующим выводом
Читайте также: