С ++ читання в текстовому файлі з номерами

У мене є текстовий файл з 16 рядками цілих чисел. Кожен рядок містить 5 цілих чисел, ось перші 4 рядки файлу,

0 0 0 0 0

     

1 2 3 4 5

     

5 4 3 2 1

     

5 100 1000 10000 10500

Мені потрібно одночасно прочитати одну лінію, зберігати всі масиви в 5 одиниць, а потім знайти максимальне значення. Я можу це зробити на свій розсуд чудово. У мене є проблеми з переходом на наступний рядок у файлі після того, як я закінчу читання попереднього рядка.

  1. Прочитайте перший рядок із текстового файлу

  2. зберігати номери в масиві

  3. відправте масив у функцію, яка повертає найбільше ціле число в масиві

  4. встановіть, хто повернув номер у новий масив, який в кінцевому рахунку міститиме найбільші числа з усіх 16 рядків файлу

  5. прочитайте наступний рядок файлу

  6. напишіть масив з масивом 16 int до файлу

У мене виникають проблеми з кроком 5. Кожен раз, коли я запускаю свій код, він читає рядок 1 щоразу.

#include 
#include 
using namespace std;

int main()
{
    int n,i,j;
    int temp[5];
    //ask user
    cout<<"How many lines are in the file\n";
    cin>>n;
    int *array = new int[n];
    //open file
    ifstream inFile;
    inFile.open("input.txt");

    for(j=0;j<5;++i)
        {
            inFile >> temp[i];
            cout<<<" ";
        }
        cout<<"\n";
    }
    return 0;
}

Як ви можете бачити, у мене ще немає функціональної функції find max, я хочу виправити, як я читаю файл, перш ніж перейти до аналізу фактичних даних.

І так, це домашній проект, який повинен був виконати через кілька днів, але мій вчитель навіть не пояснював читання у файлах і сказав нам прочитати пояснення в підручнику (що не допомагало тому, що ми робили). Я дивлюся, щоб навчитися не просто пройти домашнє завдання, тому коротке пояснення/приклад того, що мені не вистачає, добре.

0

3 Відповіді

Я б одразу захопив всю лінію за допомогою istream :: getline() а потім проаналізувати результуючий рядок. Потім зателефонуйте getline() знову і т. Д. Оскільки ви, напевно, не читаєте в кінцевому символі, хоча, чому ви отримуєте точну поведінку, ви не дуже зрозумілі для мене.

1
додано
@Will Перевірте сторінку документа, з якою я пов'язаний. Аргументи є покажчиком на масив char, який містить вхідний рядок, максимальну кількість символів для читання та (необов'язково) делімітер, який ви хочете використовувати.
додано Автор Matt Phillips, джерело
@Виконайте strtok() . Це дозволяє розбити рядок C на індивідуальні номери (а потім використати atoi чи щось, щоб перетворити їх у цілі числа). Опис трохи заплутаний, але якщо ви використовуєте приклад як шаблон, ви повинні мати змогу отримати його на роботу.
додано Автор Matt Phillips, джерело
@Will Це саме те відповідь, яку я дав вам, зателефонуйте inFile.getline ()
додано Автор Matt Phillips, джерело
буде лінійкою 1 бути istream :: getline (0)? або (1) чи ця функція навіть не має значення?
додано Автор Will Gunn, джерело
Спасибі, але я дійсно просто починаю C ++ (у мене є гідне розуміння C), і я не знаю, як проаналізувати символ рядка getline дає вам мої цифри.
додано Автор Will Gunn, джерело
Дякую за допомогу, і я бачу, як цей метод може виявитись чистим, але чи знаєте ви будь-який спосіб сказати inFile з ifstream, щоб прочитати наступний рядок?
додано Автор Will Gunn, джерело
Спасибі, я спробую це тоді.
додано Автор Will Gunn, джерело

Ваш код відмінно працює для мене. Я вважаю, що є проблема з відкриттям файлу, тому він продовжує виводити елементи temp [], як вони були ініціалізовані. Спробуйте отримати читання в режимі inFile.

1
додано
це те, що я вже роблю. У своїй останній програмі я не виведу кожен номер як його читав, я поставив це в для налагодження цілей. Якщо я не розумію вас, тому у мене є inFile >> temp [i]; cout << temp [i] << "";
додано Автор Will Gunn, джерело
Я забирав ініціалізацію темпу і додавав його в cout \ n, тому він показує вихід для кожного рядка на власній лінії в терміналі замість всіх разом. вивід змінено, але всі 16 рядків показують це 0 0 1880267544 32654 1
додано Автор Will Gunn, джерело
Я додав цикл cout відразу після перевірки температури, і так вони є початковими значеннями, так що я думаю, моя проблема полягає в тому, що вона не читає в файлі правильно?
додано Автор Will Gunn, джерело
Дякуємо вам за допомогу, я розміщую повний шлях до файлу, і мій вихідний код працює :)
додано Автор Will Gunn, джерело
Ваш вихід не настільки ілюстративний для мене - початкові значення temp [] аналогічні змісту першого рядка. Спробуй ініціалізувати temp [] як {-1}, що фактично покаже більше :) UPD: якщо ця модифікація нічого не змінює, будь ласка, надайте мені інформацію про вашу платформу та розробника, які ви використовуєте - така поведінка може бути цікавою .
додано Автор Igor Shalyminov, джерело
Я б додавав ще один вихід з самого початку, щоб переконатися, що це не вихідні значення temp []. І спробуйте fscanf ().
додано Автор Igor Shalyminov, джерело
Точно Спробуйте вказати повне ім'я файлу чи встановити права доступу.
додано Автор Igor Shalyminov, джерело

Ну, я не думаю, що вам потрібен масив. Просто прочитайте в рядку за одним рядком, токенізуйте його, статично віддаючи кожен до int (дивіться значення ascii в діапазоні чисел 0-9, оскільки вони є надзвичайно обережними, перевіряйте на негативи тощо) і безпосередньо зберігайте макс. Повторитесь до EOF, і ви, можливо, матимете найбільш ефективне рішення.

Отже, кроки будуть

1) Оголосіть тимчасову рядок.

2) Читати в рядку

3) Токенизувати на просторі

4) Припустимо, що перша макс. Продовжуйте читати та порівнювати. Перерахуйте значення, якщо знайдете більший

5) Повторити до кінця

0
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147