c ++ чтение символов из файла char с помощью char, используя только массивы char [] - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю над заданием для своего класса c ++, и я довольно близок к решению своей проблемы.На данный момент я получаю вывод, который почти такой же, как я ожидал, поэтому я подозреваю, что, возможно, я неправильно понимаю основную концепцию этой проблемы.Часть моего задания, над которым я сейчас работаю, состоит в том, чтобы получить имя файла от пользователя, прочитать его, а затем отобразить этот файл при замене ключевых символов.Например,:!, Будет заменено на \ n, чтобы создать новую строку.Мне разрешено использовать только iostream и fstream, а весь текст должен обрабатываться массивами символов [].В моем текущем выводе я получаю дополнительный пробел в третьей строке, и я не понимаю, как это получается.Из-за этого, я думаю, у меня может быть неправильная логика в голове, и мне было интересно, могли бы какие-нибудь более опытные программисты объяснить, где я ошибаюсь.Я иду в правильном направлении?

вот текстовый файл, который я использую на практике: 1.txt

Type, type, type away :!
compile.
Run.
Hip hip hooray! :! No errors today! :!

Это ожидаемый вывод того же файла: 1.txt

Type, type, type away
compile. Run. Hip hip hooray! 
No errors today!

это вывод, который я получаю

Type, type, type away
compile. Run. Hip hip hooray! 
 No errors today! <<-------- extra space at the beginning!

Я вставлю свой код ниже, не стесняйтесь критиковать его любым способом.

#include <iostream>
#include <fstream>
using namespace std;
#define MAX 1024 // this is the maximum allowed number of char in a file.
                 // is it a bad idea to define it as a constant?

int main()
{
    char fileName[256];
    char data[MAX];
    int readFile(char fileName[],char data[]);
    void display(char data[], int counter);
    fstream file;

    cout << "File Name: ";
    cin >> fileName;

    int counter = readFile(fileName, data);
    display(data, counter);

    return 0;
}

int readFile(char fileName[], char data[])
{
    ifstream file;
    file.open(fileName);

    int count = 0;
    while(file.get(data[count]) && count < MAX)
    {
        count++;
    }
    file.close();
    return count;
}

void display(char data[], int counter)
{
    char formatText(char data[], int count);
    for(int i = 0; i < counter; i++)
    {
        if(data[i] == '\n') // I added this if statment in because the newline
        {                   // from the file was getting read, AND the :! was
            data[i] = '\0'; // becoming \n, printing out TWO new lines!
        }

    }
    for(int i = 0; i < counter; i++)
    {
        formatText(data, i);

        if(data[i] != ':') // All tokens have a : before, So i dont want to 
            cout << data[i]; // print out the :'s.
    }
}

char formatText(char data[], int count)
{
    if(data[count] == ':')
    {
        switch(data[count + 1]) // these are the three tokens I have been given,
        {                       // but it has to be expandable for more later.
            case '!': data[count + 1] = '\n';
                break;
            case '<': data[count + 1] = '\"';
                break;
            case '>': data[count + 1] = '\"';
                break;
        }
    }

}

Извините, если на это ответили в другом посте, я не смог найти (или, возможно, понять) ответ на свой вопрос.Спасибо за ваше время и терпение.

1 Ответ

0 голосов
/ 20 ноября 2018
Type, type, type away :!
compile.
Run.
Hip hip hooray! :! No errors. today! :!

ок.первое, что вы делаете при форматировании, это удаляете все символы новой строки '\ n' в массиве символов, и это оставляет вас с

Type, type, type away :!compile.Run.Hip hip hooray! :! No errors today! :!

, а затем вы заменяете все!!, предшествующие: 's на' \n ', но если вы заметили, что в этом состоянии все ваши:! имеют непропусканный символ в следующей позиции индекса, за исключением одного.

 :! No errors

и это ваша ошибка, потому что затем она заменяет вашу последовательность как \n No errors

, изменяя ваши входные данные на

Type, type, type away :!
compile.
Run.
Hip hip hooray! :!No errors today! :!

, чтобы устранить эту проблему с нехваткой места.

...