Использование цикла while для вывода данных, но пропускает первое число, необходимое для вывода. Программа очень близка к работе нормально, но не работает - PullRequest
0 голосов
/ 25 апреля 2020

Пример выполнения задачи

Описание проблемы (1)

Описание проблемы (2) Ссылка выше изображение того, что программа должна делать после чтения в текстовом файле и правильного вывода в другой файл. Две другие ссылки являются описанием самой проблемы. Моя проблема в том, что, хотя большая часть logi c работает, когда дело доходит до ее распечатки, она пропускает первое число во входном файле. Например, если входной файл был: 1 10000 2 5000 3 150000 Прямо сейчас выводится файл в файле: Store 2: * Store 3: *** Опять же, изображение предоставляет лучший пример того, что должно произойти. Код должен работать для любого заданного текстового файла, независимо от порядка чисел: (например: 50 10000, 5 5000 и т. Д.).

Я не уверен, почему это происходит. Я прилагаю свой код для справки ниже. Я хотел бы заранее извиниться за отсутствие комментариев, я пытаюсь сначала исправить ошибку. Однако я сузил ошибку до l oop в основной функции. Во-вторых, я новичок, поэтому прошу прощения за любые глупые ошибки, которые я совершил, или если я сделал что-то более неэффективным образом. Еще одно замечание: я не могу изменить сигнатуры для функций, и мне нужно проверить значения, если они действительны в функции readFile (). Я также не могу использовать массивы, команду паузы, прерывание и продолжение. В-третьих, я новичок в переполнении стека, поэтому прошу прощения за любые ошибки, которые я делаю. Спасибо!

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

#include <iostream>
#include <iomanip>
#include <cmath>
#include <fstream>
using namespace std;

bool readFile(ifstream&, long long int&, unsigned int&);
void display(ofstream&, long long int, unsigned int);

int main()
{
    ifstream inputFile;
    ofstream outputFile;
    string fileName;

    long long int salesData;
    unsigned int storeNumber;

    cout << "Enter input file name" << endl;
    cin >> fileName;

    inputFile.open(fileName);

    bool fileRead = readFile(inputFile, salesData, storeNumber);

    if(fileRead)//inputFile >> storeNumber >> salesData)
    {
        outputFile.open("saleschart.txt");
        outputFile << "SALES BAR CHART" << endl;
        outputFile << "(Each * equals 5,000 dollars)" << endl;

        while(inputFile >> storeNumber >> salesData)
        {
            display(outputFile, salesData, storeNumber);
            /*
            if(storeNumber < 1 || storeNumber > 99)
            {
                cout << "The store number " << storeNumber << " is not valid" << endl;
            }
            if(salesData < 0)
            {
                cout << "The sales value for store " << storeNumber << " is negative" << endl;
            }
         */


        }
        inputFile.close();
        outputFile.close();
    }



    return 0;

      /*
       while(inputFile >> storeNumber >> salesData)
       {
           int counter = 1;
           for(int i = 1; i <= counter; i++)
           {
               counter++;
               bool fileRead = readFile(inputFile, salesData, storeNumber);
               if(fileRead)
               {
                   outputFile.open("saleschart.txt");
                   outputFile << "SALES BAR CHART" << endl;
                   outputFile << "(Each * equals 5,000 dollars)" << endl;
                   display(outputFile, salesData, storeNumber);
               }
           }
        */
}


bool readFile(ifstream& inputFile, long long int& salesData, unsigned int& storeNumber)
{
    if(inputFile)
    {
        inputFile >> storeNumber >> salesData;
        if(storeNumber == NULL)
        {
            cout << "The file was empty" << endl;
            return false;
        }
        if(storeNumber < 1 || storeNumber > 99)
            cout << "The store number " << storeNumber << " is not valid" << endl;
        if(salesData < 0)
            cout << "The sales value for store " << storeNumber << " is negative" << endl;
        else
            return true;
    }
    else
    {
        cout << "File \"sales.txt\" could not be opened" << endl;
       return false;
    }

    return false;
    /*
    if(inputFile.eof())
        return false;
    else
    {
        inputFile >> storeNumber >> salesData;
        return true;
    }
    */
}


void display(ofstream& outputFile, long long int salesData, unsigned int storeNumber)
{
    outputFile << left << setw(6) << "Store" << right << setw(2) << storeNumber << ": ";
    cout<<storeNumber; //DEBUG
    for(int i = 0; i < (salesData/5000); i++)
    {
        outputFile << left << "*";
    }
    outputFile << endl;

}

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

У вас есть несколько проблем, главное в том, что функция readFile читает первые два значения, а затем вы отбрасываете прочитанные данные.

Эти отброшенные данные никогда не будут записаны на выход file.


Также в функции readFile есть сравнение storeNumber == NULL, которое может быть проверкой, если ввод был неудачным, но это не так.

Во-первых, поскольку C ++ не имеет нулевых значений, NULL - это старая C -константа совместимости для нулевого указателя .

Во-вторых, вы уже проверьте правильность в l oop, где вы читаете оставшиеся данные, где вы используете целое входное выражение inputFile >> storeNumber >> salesData в качестве условия.


Теперь, чтобы сложить все вместе, вы не функция readFile вообще не нужна, вместо этого все, что вам нужно, это чтение l oop:

outputFile.open("saleschart.txt");
if (!outputFile)
{
    // Failed to open the output file
    return 1;
}

inputFile.open(fileName);
while(inputFile >> storeNumber >> salesData)
{
    display(outputFile, salesData, storeNumber);
}
0 голосов
/ 25 апреля 2020

Пропускаются первые числа, потому что вы читаете их (и не сохраняете их) в функции readFile. Это не имеет ничего общего с вашим временем l oop, что совершенно правильно. Но вы не можете прочитать одни и те же числа дважды, и вы уже прочитали первые числа к тому времени, когда вы добираетесь до своего времени l oop.

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

ОК, прочитав ваш вопрос еще раз, я вижу, что необходимо использовать функцию readFile. Если это так, то правильным решением будет удалить текущее содержимое функции readFile и переместить параметр while l oop в функцию readFile.

...