2015-06-08 2 views
-3
char input[100]; //Used to check grammar 
char *s; 

int main(int argc, char *argv[]) { 

    ifstream fin("input.txt"); //Open input file 
    while (fin>>input) { //Store text in input[] 
     s = input; //Point c at the input text 

     cout<<"String read from file: "<<input<<endl; //Show input text 
     if (A() && *s == '\0') { //Testing the grammar 
      cout<<"The string \""<<input<<"\" is in the language."<<endl; 
     } 
     else cout<<"The string \""<<input<<"\" is not in the language."<<endl; 
     cout<<endl; //Formatting for output in console 
    } 
    fin.close(); //Close input file 


    return 0; 
} 

Может кто-нибудь сказать мне, что я делаю неправильно здесь. Парсер не читает строку из текстового файла.метод рекурсивного спуска Помощь (Не читает строку текстового файла)

+2

Добро пожаловать в StackOverflow. Пожалуйста, уделите немного времени, чтобы прочитать рекомендации о том, как писать приемлемые вопросы в [help]. «Как спросить» и «MVCE» важны. Ключевой элемент, отсутствующий в вашем вопросе, поскольку он стоит ... в чем ваш вопрос? Каковы симптомы проблемы? Что вы ожидали? – GreenAsJade

+0

Да, сэр, я очень новичок в этом форуме и задаюсь вопросом, может ли кто-нибудь помочь мне просто знать, как разбираться с текстовым файлом. –

+1

Что делает 'A()' do? Вы не показываете код для этого. –

ответ

1

Давайте рассмотрим это как две проблемы.

Задача 1: чтение в файле.

Я раздели все, что не является абсолютно необходимым для чтения данных в.

char input[100]; //Used to check grammar 

int main(int argc, char *argv[]) { 

    ifstream fin("input.txt"); //Open input file 
    while (fin>>input) { //Store text in input[] 
     cout<<"String read from file: "<<input<<endl; //Show input text 
    } 
    return 0; 
} 

Ничего особенного здесь не так, но вы должны серьезно рассмотреть вопрос о замене char input[100]; с std::string input;, чтобы спасти Вас от головной боли с большими лексем , Например, посмотреть, что здесь происходит:

int main() 
{ 
    stringstream stream("1234567890"); // pack ten characters into stream 
             // note: no whitespace. 
    char snookums[] = "snookums"; 
    char array[5]; 
    cout << snookums << endl; // prove contents of snookums 
    stream >> array; // read up to first whitespace from stream into array 
    cout << array << endl; // display what we read. 
    cout << snookums << endl; // oh dear. Now look at poor snookums! 
    return 0; 
} 

выход:

snookums 
1234567890 
67890 

Несмотря на массив будучи размер 5, он содержит все 10. Или же это? Неа. К сожалению, бедные снукумы перебежали. Это не произойдет со строками.

Для всех, кого мы знаем fin>>input, просто введите 30000 символов из файла без пробелов, уничтожив остальную память вашей программы, и программа умерла, прежде чем распечатать что-либо.

Во всяком случае, ваш код оставляет несколько вопросов:

Are вы на самом деле в состоянии открыть файл? На самом деле ты не знаешь. Вы никогда не проверяли.

Был ли этот файл пустым? Также не знаю. Вы не сказали нам. Это одна из тех вещей, о которых люди начинают рассказывать в комментариях.

Ничего из этого не исправляет, но, надеюсь, дает вам представление о том, что происходит не так.

string input; // using string in case the data you're reading is incompatible 
       //with a 100 character char array. 

int main(int argc, char *argv[]) { 

    ifstream fin("input.txt"); //Open input file 
    if (fin.is_open() 
    { 
     while (fin>>input) 
     { //Store text in input 
      cout<<"String read from file: "<<input<<endl; //Show input text 
     } 
    } 
    else 
    { 
     cout << "Failed to open file." << endl; 
    } 
    return 0; 
} 

Как только вы знаете, действительно ли вы читаете данные, а если нет, почему бы и нет.

Задача 2: анализ языка.

Мы не можем помочь вам здесь. Никакой информации не было предоставлено, но несколько заметок о стиле кодирования, потому что они помогут вам задать будущие вопросы:

A() не имеет смысла для всех, кроме вас. Дайте ему описательное имя, чтобы кто-то, кроме вас, имел некоторые подсказки о том, что он делает. A() не принимает параметров. Я предполагаю, что это потому, что он работает на input. Хорошо, но почему бы не пройти input? Стоимость минимальна и предоставляет читателям больше информации. Обратите внимание, как комментаторы обнулили на A() сразу? Это страх. Хороший вид страха. У нас нет [insert expletive here] понять, что это такое или что он делает, поэтому он мгновенно анализируется.

A(input) читает мне как «A делает что-то для ввода». Я не знаю, что он делает, но он делает это до input. Если у писателя программы нет истории глупостей, она, вероятно, только делает материал до input, и мне не нужно бояться этой функции почти так же.

LanguageInterpreter() говорит мне, что был запущен переводчик языка. Не много, но если я ищу ошибку в коде чтения файла, я вряд ли найду его там. К сожалению, это также говорит мне, что LanguageInterpreter празднует глобальные данные, и Кром знает, какие побочные эффекты он может иметь для остальной части программы.

LanguageInterpretter(input) говорит мне много. С одной стороны, он говорит мне, что я могу продолжать свой день, потому что это не имеет никакого отношения к тому, что я читал в файле данных. Сначала я проверю другие места на наличие ошибок.

+0

Я могу прочитать файл, а затем указать указатель указывают на эту конкретную строку, но теперь я застрял в этой части if (A() && * s == '\ 0'), и я получаю сообщение об ошибке –

+0

@JonAbraham Строка C++ не работает точно так же, как строка C , Чтобы проверить пустую строку, просто вызовите метод 'empty'. 'A() &&! Input.empty()'. Я сомневаюсь, что вам нужно 's'. [Считывание по строкам.] (Http://en.cppreference.com/w/cpp/string/basic_string) – user4581301

+0

Хорошо, двигаясь, поэтому я попробовал то, что вы упомянули, и эта часть не покажет никаких ошибок. –

0

string *s; 
 

 
int main() 
 
{ 
 
\t string input; 
 
    ifstream fin("input.txt"); 
 
\t 
 
\t if(fin.is_open()) 
 
\t { 
 
\t \t while(getline(fin,input)) 
 
\t \t { 
 
\t \t \t s=&input; 
 
\t \t \t 
 
\t \t \t if (A() && *s == '\0') /* error: no match for 'operator==' in '* s == '\000''*/ 
 

 

 

 
\t \t \t { //Testing the grammar 
 
\t \t \t \t cout<<"The string \""<<*s<<"\" is in the language."<<endl; 
 
\t \t \t } 
 
\t \t \t else cout<<"The string \""<<*s<<"\" is not in the language."<<endl; 
 
\t \t \t cout<<endl; 
 
\t \t \t 
 
\t \t \t 
 
\t \t } 
 
\t } 
 
    fin.close(); 
 
\t 
 
    
 
    return 0; 
 
}

Смежные вопросы