принимая входные данные из файла - PullRequest
0 голосов
/ 23 сентября 2011

у меня есть следующий файл с именем asmfile.txt

copy start 1000
read  ldx zero
      rd indev
rloop tix k100

для того, чтобы получить исходные данные из этого файла, я написал следующий код ....

void aviasm::crsymtab()
{


ifstream in(asmfile,ios::in);//opening the asmfile
in.seekg(0,ios::beg);


char c;
string str[3];
string subset;
long locctr=0;
int i=0;


while((c=in.get())!=EOF)
{
    in.putback(c);
    str[0]="";
    str[1]="";
    str[2]="";

    while((c=in.get())!='\n')
    {

        in.putback(c);
        in>>str[i];
        i==2?i=0:i++;  //limiting i to 2....

    }

    cout<<str[0]<<" "<<str[1]<<" "<<str[2]<<endl;
}

in.close();
}

// теперь проблема в том, что первые три строки успешно вводятся в str ... но последняя строка не вводится в str .... я знаю это, потому что при запуске программы на консоли я вижу. ..

copy start 1000
read  ldx zero
rd indev

Изменения отступа 'rd indev' из-за того, что str [0] = "rd" и str [1] = "indev" ..... plz, скажите мне, почему четвертая строка не вводится в str ....

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

Относительно того, почему ваш код не работает: while((c=in.get())!='\n') входит в бесконечный цикл, когда в последней строке asmfile нет символа новой строки.

Измените i==2?i=0:i++; на i ++ и переместите int i=0; в цикле while, отредактируйте asmfile, чтобы он имел символ новой строки за последней строкой, и ваш код будет работать.

Тем не менее, вы действительно ДОЛЖНЫ делать это так, как предложил Рене. Подобный код является грязным и подвержен ошибкам.

3 голосов
/ 23 сентября 2011

Я не знаю, какова цель чтения файла символ за символом и помещения их обратно в поток.Строка

string str[3];

определяет строки str[0] до str[2].Запись в несуществующий str[3] является неопределенным поведением.Более понятный подход:

std::ifstream in(asmfile);
std::vector<std::string> lines;
std::string line;

while (std::getline(in, line))
{
  lines.push_back(line);
}

. Впоследствии lines.size() дает количество успешно прочитанных строк.

for (size_t i = 0; i < lines.size(); ++i)
{
  std::cout << i << " :  " << lines[i] << '\n';
}
0 голосов
/ 23 сентября 2011

У меня проблемы с отладкой вашего кода, потому что я не понимаю вашего намерения - что за дела с get() и pushback() вызовами?Итак, вместо ответа на ваш ближайший вопрос, позвольте мне переписать ваш код:

#include <string>
#include <sstream>
#include <iostream>
#include <fstream>

const char * asmfile("/tmp/asm.txt");
void crsymtab()
{
  std::ifstream in(asmfile); // opening the asmfile

  std::string line;
  while(std::getline(in, line)) {
    std::istringstream sline(line);
    std::string str[3];
    if(sline.peek() == ' ')
      sline >> str[1] >> str[2];
    else
      sline >> str[0] >> str[1] >> str[2];
    std::cout << str[0] << " " << str[1] << " " << str[2] << "\n";
  }
}

int main() { crsymtab(); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...