2015-06-12 2 views
-1

Может кто-нибудь сказать мне, что я делаю неправильно здесь, я получаю сообщение об ошибке, когда getline() не объявлен в этой области ......... любая помощь будет оценена по достоинству.getline() function error in C++ code

нет функции соответствия для вызова GetLine (символ **, size_t *, FILE * &)

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

    using namespace std; 

    char *s; 

    int main(int argc, char *argv[]) 
    { 
     FILE* fd = fopen("input.txt", "r"); 
     if(fd == NULL) 
     { 
      fputs("Unable to open input.txt\n", stderr); 
      exit(EXIT_FAILURE); 
     } 

     size_t length = 0; 
     ssize_t read; 
     const char* backup; 

     while ((read = getline(&s, &length, fd)) > 0) 
     { 
      backup = s; 
      if (A() && *s == '\n') 
      { 
       printf("%sis in the language\n", backup); 
      } 
      else 
      { 
       fprintf(stderr, "%sis not in the language\n", backup); 
      } 
     } 
     fclose(fd); 

     return 0; 
    } 
+0

's' является объявлено ... где? И 'getline' не объявляет себя. Включите ваш '# include' список с вашим кодом. Я предполагаю, что вы пытаетесь использовать ['getline'] (http://man7.org/linux/man-pages/man3/getline.3.html) из POSIX-библиотек, верно? – WhozCraig

+0

folks Я только что редактировал свой пост, так как ожидал, что вы спросите меня, что –

+0

'getline' из POSIX находится в' stdio.h', который вы не включаете (или эквивалент C++, 'cstdio'). И вы, возможно, должны объявить _POSIX_C_SOURCE с соответствующим значением версии, чтобы вытащить его объявление в ('200809L' или позже). – WhozCraig

ответ

1

Вы должны будете использовать C++ код стиля для того, чтобы использовать GetLine в кроссплатформенной манере.

#include <fstream> 
#include <string> 

using namespace std; 

std::string s; 

bool A() { return true; } 

int main(int argc, char *argv[]) 
{ 
    ifstream myfile("input.txt"); 
    if(!myfile.is_open()) 
    { 
     fprintf(stderr, "Unable to open input.txt\n"); 
     return 1; 
    } 

    size_t length = 0; 
    size_t read; 
    std::string backup; 

    while (getline(myfile, s)) 
    { 
     backup = s; 
     if (A() && s == "\n") 
     { 
      printf("%s is in the language\n", backup.c_str()); 
     } 
     else 
     { 
      fprintf(stderr, "%s is not in the language\n", backup.c_str()); 
     } 
    } 

    return 0; 
} 
+0

все еще не работает –

+0

ах, похоже, что версия stdio.h getline является расширением GNU и вы должны использовать другой компилятор (MSVC?). Вам нужно будет использовать свой код для использования C++-версии getline и std :: string. – caustik

1

Вы, кажется, немного смущены различными сигналами функции getline.

Стандарта C++ std::getline подписи

template< class CharT, class Traits, class Allocator > 
std::basic_istream<CharT,Traits>& getline(std::basic_istream<CharT,Traits>& input, 
              std::basic_string<CharT,Traits,Allocator>& str, 
              CharT delim); 

Он принимает входной поток объект, строку символов и разделитель (есть перегрузка без разделителя тоже).

getline POSIX подпись

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream); 

с разделителем опциональной снова.

Теперь в вашем коде передаются ваши аргументы, как если бы вы вызывали версию posix без разделителя. Если вы хотите использовать стандартный, вам придется изменить аргументы (т. Е. istream объект вместо FILE*). Я не знаю, доступен ли posix для вас, поскольку posix отличается от любого стандарта C++.

Обратите внимание, что fputs, FILE*, fprintf - это C-функции обработки файлов, а не C++.

+0

Я исправлю код, чтобы сделать его более простым. Я пойду с std :: getline –

+0

@JonAbraham, если у вас возникнут проблемы с I/O, вы можете захотеть пройти [учебник] (http://www.cplusplus.com/doc/tutorial/files/). Я не знаю, как вы каким-то образом обнаружили C-функции, а не C++. –

1

Что вы пытаетесь сделать с getline(&s, &length, fd)? Вы пытаетесь использовать C getline?

Предполагая, что вы открыли файл правильно, в C++ ваш getline должен выглядеть примерно так: getline(inputStream, variableToReadInto, optionalDelimiter).

  • Вы не включили <stdio.h> но ты включаешь <fstream>. Может использовать ifstream fd("input.txt");
  • Что A()
  • Если вы пытаетесь использовать C getline, то using namespace std может мешать
  • Почему вы используете printf и fprintf, а не cout << xxxxxx и fd << xxxxxx
+0

@ Я изучаю жесткий путь, я думаю. Я исправлю код в соответствии с рекомендациями. –

+0

Вы переезжаете с C? –

+0

нет, я не перехожу из C –