Невозможно распечатать файл, используя поток на linux - PullRequest
0 голосов
/ 01 февраля 2020

Я пытался удалить многострочный комментарий из c запрограммированного кода. Мне нужно взять входные данные из файла, а затем нужно получить вывод. Это хорошо работает в windows системе. Я думаю, что проблема в пути к файлу Linux. Пожалуйста, помогите мне.

#include <iostream>
#include<fstream>
#include<string.h>
#include<ctype.h>

using namespace std;

int main()
{
    ifstream readfile("read.txt");
    ofstream writefile ("write.txt");
    string oneline;
    int mark=0;

    if(readfile.is_open())
    {
        while(getline(readfile,oneline))
        {
            int length=oneline.length()+1;

            char* newoneline=new char[length];
            strcpy(newoneline,oneline.c_str());
            for(int i=0;i<length;i++)
            {
               if(newoneline[i]=='/'&& newoneline[i+1]=='/')
               {
                  break;
               }
               if(newoneline[i]=='/'&& newoneline[i+1]=='*')
               {
                   mark=1;
               }
               else if(newoneline[i]=='*'&& newoneline[i+1]=='/')
               {
                  mark=0;
                  break;
               }
               if(mark==0)
               {
                  writefile<<newoneline[i];
               }
           }
           writefile<<"\n";
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 01 февраля 2020

Я не знаю, почему вы выделяете динамический c массив? Вы можете легко использовать операцию поиска строки класса следующим образом:

ifstream readfile("read.txt");
ofstream writefile("write.txt");
string oneline;
int mark = 0;


if (readfile.is_open())
{
    while (getline(readfile, oneline))
    {
        for (std::size_t i{}, length{oneline.length()}; length > 1 && i != length - 1; i++)
        {
            if (oneline.at(i) == '/' && oneline.at(i + 1) == '/')
                break;
            else
            if (oneline.at(i) == '/' && oneline.at(i + 1) == '*')
                mark = 1;
            else 
            if (oneline.at(i) == '*' && oneline.at(i + 1) == '/')
            {
                mark = 0;
                break;
            }
            if (mark == 0)
                writefile << oneline.at(i);
        }
        writefile << std::endl;
    }
}

Конечно, это должно быть внутри вашего l oop.

  • Также есть утечка памяти в вашем коде: вы создаете динамический c массив каждую итерацию, не освобождая его!

  • Также эта строка: if(newoneline[i]=='/'&& newoneline[i+1]=='/') вызывает неопределенное поведение (i + i будет читать newOneLine [length ]): Ваше условие l oop должно быть i < lengith - 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...