Ошибки Unix при запуске программы на C ++ с использованием struct tm

0

Я написал программу инвентаризации для бакалеи в C++ с помощью Visual Studio 2012, и все работает плавно и, как ожидалось. Файл читается как аргумент командной строки и используется для заполнения объектов с помощью объектов Grocery. Функция, которую я использовал для проверки того, что объект Grocery скоро истекает, используется time_t и struct tm. При попытке запустить мою программу в Unix, я получаю сообщение об ошибке с помощью потока

Вот строки кода, где я получаю ошибки:

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

    deque<Grocery> groceries;
    deque<Grocery>::iterator iter;
    string filename = "";

    if (argc > 1) {
        filename = argv[1];
        fstream fileData;
        fileData.open(filename, ios::in | ios::out); //**error**
        //error check
        if (!fileData) {
            cout << "Error openeing file. Program aborting.\n";
            return 1;
        }
        string name;
        string expDate;
        string type;
        string quantity;

        while (!fileData.eof()) {
            Grocery temp;
            getline (fileData,name,'\t');
            temp.setName(name);
            getline (fileData,expDate,'\t');
            temp.setExpDate(expDate);
            getline (fileData,type,'\t');
            temp.setType(type);
            getline (fileData, quantity,'\n');
            temp.setQuantity(atoi (quantity.c_str()));
            groceries.push_back(temp);
        }   
        fileData.close();
    }
    return 0;
}

Ошибки при попытке запустить программу в Unix

  $ make all
g++ -c Grocery.cpp
g++ -c Inventory.cpp
Inventory.cpp: In function âint main(int, char**)â:
Inventory.cpp:24:45: error: no matching function for call to âstd::basic_fstream<char>::open(std::string&, std::_Ios_Openmode)â
   fileData.open(filename, ios::in | ios::out);
                                             ^
Inventory.cpp:24:45: note: candidate is:
In file included from Inventory.cpp:3:0:
/opt/rh/devtoolset-2/root/usr/include/c++/4.8.1/fstream:886:7: note: void std::basic_fstream<_CharT, _Traits>::open(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode]
       open(const char* __s,
       ^
/opt/rh/devtoolset-2/root/usr/include/c++/4.8.1/fstream:886:7: note:   no known conversion for argument 1 from âstd::string {aka std::basic_string<char>}â to âconst char*â
make: *** [Inventory.o] Error 1

Makefile

MKFILE    = Makefile

#
# Definitions of list of files:
#
HSOURCES  = Grocery.h
CSOURCES  = Grocery.cpp Inventory.cpp

ETCSRC    = README ${MKFILE}
EXECBIN   = main
ALLCSRC   = ${CSOURCES}
OBJECTS   = ${ALLCSRC:.cpp=.o}
ALLSRC    = ${ETCSRC} ${HSOURCES} ${CSOURCES}
LISTSRC   = ${ALLSRC}

#
# Definitions of the compiler and compilation options:
#
GCC       = g++

#
# The first target is always ''all'', and hence the default,
# and builds the executable images
#
all : ${EXECBIN}

#
# Build the executable image from the object files.
#
${EXECBIN} : ${OBJECTS}
        ${GCC} -o ${EXECBIN} ${OBJECTS}

#
# Build an object file form a C source file.
#
%.o : %.cpp
        ${GCC} -c $<

#
# Clean and spotless remove generated files.
#
clean :
        - rm -rf ${EXECBIN} ${OBJECTS}

ФИКСИРОВАННЫЙ ответ, указанный ниже

  • 1
    что такое тип данных expDate
  • 0
    Извини насчет этого. Вот переменные, которые инициализированы в моем файле Grocery.h: time_t t; struct tm * expDate;
Показать ещё 10 комментариев
Теги:
fstream
visual-studio-2012

2 ответа

2
Лучший ответ
Inventory.cpp:24:45: error: no matching function for call to âstd::basic_fstream<char>::open(std::string&, std::_Ios_Openmode)â
fileData.open(filename, ios::in | ios::out);

basic_fstream(const string&, ios_base::openmode) доступен только в режиме С++ 11.

Вы компилируете свой код в режиме С++ 98. -std=gnu++11 до g++ при компиляции.

  • 0
    Спасибо Максим! Это добилось цели. Можно ли как-нибудь выйти из режима C ++ 98 навсегда? Я все еще довольно новичок в Unix.
  • 0
    @KyleN C ++ 98 является режимом по умолчанию для gcc-4.8.2. Вам нужно -std=gnu++11 передать -std=gnu++11 чтобы переключить его. Обычно вы можете изменить флаги компилятора, отредактировав ваш make-файл.
Показать ещё 2 комментария
1

Я думаю, вам нужна чистая сборка. Поскольку у вас есть объявления в файле заголовков, и вы, возможно, изменили expdate с типа tm на tm *.

  • 0
    Я не уверен, что следую. Я не знаю, как извлечь текущее время без использования местного времени. Не могли бы вы показать мне, как бы вы реализовали это с помощью memcpy?
  • 0
    извини, оставь вещи memcpy отдельно. Только что отредактировал пост. Понятно, что expDate распознается компилятором как структура tm, а не как указатель. Поэтому попробуйте разобраться в этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню