Проблема, связанная с size_t - PullRequest
0 голосов
/ 02 августа 2009

Если вы зайдете в мою историю сообщений, вы увидите, что я пытаюсь разработать переводчика для языка, над которым я работаю. Я хочу использовать size_t , используя два разных кода, но все они ничего не возвращают.

Вот пост того, что я пытался: /978624/prochitaite-chto-nibud-posle-slova-v-c

Когда я пытаюсь использовать проверяемый файл, он ничего не возвращает. Вот пример файла (только функция печати, которую я пытаюсь разработать на моем языке):

print "This is a print function that i'm trying to develop in my language"

Но помните, что это похоже на печать в Python, то, что пользователь вводит в кавычки (""), это то, что должно быть напечатано для всех, помните, что пользователь может выбрать то, что помещено в кавычки, а затем не помещать что-то вроде простой подсказки, опубликуйте что-то, что читает внутри цитат, и распечатайте это для всех. Но вот два тестовых кода для этого, но все они мне ничего не возвращают:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
int main( int argc, char* argv[] )
{
    // Error Messages
    string extension = argv[ 1 ];

    if(argc != 2)
    {
       cout << "Error syntax is incorrect!\nSyntax: " << argv[ 0 ] << " <file>\n";
      return 0;
    }
    if(extension[extension.length()-3] != '.')
    {
       cout << "Extension not valid!" << endl;
       cout << "Default extension *.tr" << endl;
      return 0;
    }
    if(extension[extension.length()-2] != 't')
    {
       cout << "Extension not valid!" << endl;
       cout << "Default extension *.tr" << endl;
      return 0;
    }
    if(extension[extension.length()-1] != 'r')
    {
       cout << "Extension not valid!" << endl;
       cout << "Default extension *.tr" << endl;
      return 0;
    }
    // End of the error messages

    ifstream file(argv[ 1 ]);
    if (!file.good()) {
       cout << "File " << argv[1] << " does not exist.\n";
      return 0;
    }
    string linha;
    while (!file.eof())
    {
    getline(file, linha);
    if (linha == "print")
       {
          size_t idx = linha.find("\""); //find the first quote on the line
          while ( idx != string::npos ) {
             size_t idx_end = linha.find("\"",idx+1); //end of quote
             string quotes;
             quotes.assign(linha,idx,idx_end-idx+1);
             // do not print the start and end " strings
             cout << "quotes:" << quotes.substr(1,quotes.length()-2) << endl;
             //check for another quote on the same line
             idx = linha.find("\"",idx_end+1); 
          } 
       }
    }
  return 0;
}

Второй:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
int main( int argc, char* argv[] )
{
    // Error Messages
    string extension = argv[ 1 ];

    if(argc != 2)
    {
       cout << "Error syntax is incorrect!\nSyntax: " << argv[ 0 ] << " <file>\n";
      return 0;
    }
    if(extension[extension.length()-3] != '.')
    {
       cout << "Extension not valid!" << endl;
       cout << "Default extension *.tr" << endl;
      return 0;
    }
    if(extension[extension.length()-2] != 't')
    {
       cout << "Extension not valid!" << endl;
       cout << "Default extension *.tr" << endl;
      return 0;
    }
    if(extension[extension.length()-1] != 'r')
    {
       cout << "Extension not valid!" << endl;
       cout << "Default extension *.tr" << endl;
      return 0;
    }
    // End of the error messages

    ifstream file(argv[ 1 ]);
    if (!file.good()) {
       cout << "File " << argv[1] << " does not exist.\n";
      return 0;
    }
    string linha;
    while (!file.eof())
    {
    getline(file, linha);
    if (linha == "print")
       {
          string code = " print \" hi \" ";
          size_t beg = code.find("\"");
          size_t end = code.find("\"", beg+1);
          // end-beg-1 = the length of the string between ""
          cout << code.substr(beg+1, end-beg-1);
       }
    }
  return 0;
}

А вот что напечатано в консоли:

ubuntu@ubuntu-laptop:~/Desktop/Tree$ ./tree test.tr
ubuntu@ubuntu-laptop:~/Desktop/Tree$

Как я и сказал, он ничего не печатает. Смотрите мой пост в Д.И.К .: http://www.dreamincode.net/forums/showtopic118026.htm

Спасибо, Натан Паулино Кампос

Ответы [ 2 ]

5 голосов
/ 02 августа 2009

Ваша проблема в линии

if (linha == "print")

, что предполагает, что вся прочитанная строка является "print", а не тем, что строка НАЧИНАЕТСЯ с print.

Кроме того, зачем вам использовать 3 отдельные проверки для расширения .tr вместо простой проверки конца имени файла для ".tr"? (Вам также следует убедиться, что argv [1] достаточно длинный, прежде чем проверять подстроки ...)

2 голосов
/ 02 августа 2009

getline(file, linha) будет читать всю строку из файла, поэтому linha никогда не будет равно print.

...