2016-04-17 2 views
-2

Я пытаюсь сделать программу на C++ для чтения ввода из файла, поместить пробелы перед разделителями и записать в другой файл. Пример: Input: INT основной() Выход: INT основной()Ошибка segmantation в C++, без вывода

#include <iostream> 
#include <cstdlib> 
#include <fstream> 
using namespace std; 

fstream oup, inp; 
int dsize = 18; 
char delim[] = {',', ' ', '\n', '\t', '\"', '(', ')', '{', '}', 
       '\'', '[', ']', '+', '-', '*', '&', '/', '%'}; 

bool isDelim(char c) { 
    for (int i = 0; i < 18; i++) 
    if (c == delim[i]) 
     return true; 
    return false; 
} 

void chartost(string a) { 
    int d = 0; 
    if (a.length() == 1) 
    oup << a << " "; 
    else { 
    for (unsigned i = 0; i < a.length(); i++) { 
     if (isDelim(a[i])) { 
     d = 1; 
     oup << a.substr(0, i) << " "; 
     chartost(a.substr(i, a.length())); 
     } 
    } 
    if (d == 0) { 
     oup << a << " "; 
    } 
    } 
} 

int main() { 
    cout << "Initial Point"; 
    inp.open("test.c", ios::in); 
    oup.open("testspace.c", ios::out); 
    string a; 
    cout << "before isopen"; 
    if (inp.is_open() && oup.is_open()) { 
    while (inp >> a) { 
     cout << a; 
     chartost(a); 
    } 
    cout << "after operations \n"; 
    inp.close(); 
    oup.close(); 
    } 
    return 0; 
} 

Для отладки я использовал COUT во многих местах. Я получаю ошибку сегментации для этого, и даже cout в точке входа main не отображается.

+3

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

+3

Кроме того, чтобы гарантировать, что вы выведете заявления 'cout', поставьте инструкцию' endl' после вывода. –

+0

Codeblocks -warning: GDB: Не удалось установить управляющий терминал: операция не разрешена –

ответ

1

Код - это беспорядок, который очень затрудняет обнаружение ошибок, однако я замечаю, что ваша функция диаграммы является рекурсивной, но не завершается, когда рекурсия завершается. Цикл for для первого вызова обрабатывает оставшуюся часть строки после, код повторяется в остальной части строки. Я бы начал искать вашу проблему там.

+0

спасибо .. я начну смотреть на него –

+0

проблема заключалась в построении подстроки, длина подстроки была неправильной, и, следовательно, программа пыталась построить строку длиной 0. Большое спасибо за помощь. –

+0

вы, вероятно, захотите выйти из цикла после вызова рекурсии в любом случае (или удалить рекурсию и просто использовать цикл) ... но я рад, что вы нашли непосредственную проблему! – PeteB