2009-12-30 3 views
1

Я хочу добавить новую функцию (fstream) в программу, которая уже использует массивы char для обработки строк. Проблема в том, что приведенный ниже код дает строки, и единственный способ, которым я могу думать, что это будет работать, - это иметь промежуточную функцию, которая бы скопировала строки char char в новый массив символов, передала их на функции в программе, вернуть результаты и затем скопировать результат char с помощью char обратно в строку.Может ли getline() использоваться для получения массива символов из fstream

Несомненно (надеюсь) должен быть лучший способ?

Спасибо!

void translateStream(ifstream &input, ostream& cout) { 
    string inputStr; 
    string translated; 

    getline(input, inputStr, ' '); 

    while (!input.eof()) { 
    translateWord(inputStr, translated); 
    cout << translated; 
    getline(input, inputStr, ' '); 
    } 

    cout << inputStr; 

translateWord FUNC:

void translateWord(char orig[], char pig[]) { 
    bool dropCap = false; 
    int len = strlen(orig)-1; 
    int firstVowel = findFirstVowel(orig); 
    char tempStr[len]; 

    strcpy(pig, orig); 


    if (isdigit(orig[0])) return; 


    //remember if dropped cap 
    if (isupper(orig[0])) dropCap = true;   

    if (firstVowel == -1) { 
    strcat(pig, "ay"); 
    // return; 
    } 

    if (isVowel(orig[0], 0, len)) { 
    strcat(pig, "way"); 
    // return; 
    } else { 

    splitString(pig,tempStr,firstVowel); 

    strcat(tempStr, pig); 
    strcat(tempStr, "ay"); 

    strcpy(pig,tempStr); 
    } 


    if (dropCap) { 
    pig[0] = toupper(pig[0]); 
    } 

} 
+0

Это поможет узнать, что делает translateword() - пожалуйста, напишите хотя бы декларацию. – 2009-12-30 19:04:03

+0

добавлен сейчас Нил - (он делает перевод на лайнер свиньи) –

+0

Это обязательно провалится очень ужасно! –

ответ

2

Вы можете передать строку в качестве первого параметра для переводаWord, выполнив первый параметр a const char *. Затем вы вызываете функцию с inputStr.c_str() в качестве первого параметра. Если вы столкнулись со вторым (выходным) параметром, вам нужно либо полностью переписать translateWord, чтобы использовать std :: string (лучшее решение, IMHO), либо передать массив символов соответствующего размера в качестве второго параметра.

Кроме того, что вы выложили это на самом деле не C++ - например:

char tempStr[len]; 

не поддерживается C++ - это расширение г ++, взятый из C99.

0

Вы можете использовать функцию-член ifstream::getline. В качестве первого параметра берется буфер char*, а аргумент размера - второй.

+0

Не уверен, что я следую, я уже использую getline, хотя это выводит строку? –

+0

Есть две функции getline. – 2009-12-30 19:27:38

+0

Bhatia, предложение состоит в том, что вы должны использовать * другую функцию getline. У объектов Stream есть свой собственный метод getline, который заполняет массив символов. Используйте это вместо автономной функции getline из заголовка строки. Это * напрямую * решает вопрос, который вы задали, в то время как ответ Нила затрагивает основную проблему вашей программы - если вам нужно преобразовать в массив, а затем преобразовать обратно в строку, то, возможно, вам следует просто использовать строки исключительно, чтобы вы могли пропустите все конверсии. –

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