función de cierre no reconocida – C++

2 minutos de lectura

avatar de usuario de cybertextron
cibertextron

Tengo el siguiente fragmento de código en un archivo llamado RaftLog.cc:

#include <algorithm>
#include <fcntl.h>
#include <sys/stat.h>



namespace LogCabin {
namespace Server {
namespace RaftConsensusInternal {

namespace FilesystemUtil = Storage::FilesystemUtil;

namespace {
bool
fileToProto(const std::string& path, google::protobuf::Message& out)
{
    int fd = open(path.c_str(), O_RDONLY);
    if (fd == -1)
        return false;
    else
        close(fd);
    FilesystemUtil::FileContents file(path);

        // more code down here, not useful to the problem.

Sin embargo, cuando compilo tengo:

build/Server/RaftLog.cc: In function ‘bool LogCabin::Server::RaftConsensusInternal::{anonymous}::fileToProto(const string&, google::protobuf::Message&)’:
build/Server/RaftLog.cc:43:17: error: ‘close’ was not declared in this scope
build/Server/RaftLog.cc: In function ‘void LogCabin::Server::RaftConsensusInternal::{anonymous}::protoToFile(google::protobuf::Message&, const string&)’:
build/Server/RaftLog.cc:76:13: error: ‘close’ was not declared in this scope
In file included from ./Server/RaftConsensus.h:17:0,

no se porque el close() la función no se incluye en #include <fcntl.h>. ¿Puede alguien por favor ayudarme? También déjame saber si debo incluir más código.

necesitas incluir unistd.h archivo de encabezado si llama close función

#include <unistd.h>

Usar fopen/fclose, fdopen/close par

  • ¿Solo eso? también debo reemplazar close por fclose?

    – cibertextrón

    29 de enero de 2013 a las 3:17

  • Solo si también reemplazas open con fopen y reescriba el resto de su lógica para trabajar con un FILE*

    – Halcón Oscuro

    12 de enero de 2016 a las 0:29

  • Esto destaca una de mis liendres de larga data: open se define en fcntl.h pero es “opuesto” close se define en unistd.h. Me pregunto qué tiene que decir la sección de “razones” de POSIX sobre esto.

    –Craig Estey

    12 de enero de 2016 a las 0:34

  • @CraigEstey para mí esto tiene sentido, ya que close no tiene exactamente el efecto contrario de open. open crea una descripción de archivo y un descriptor de archivo para un archivo. Mientras close solo puede publicar el descriptor del archivo, pero no necesariamente la descripción del archivo. Básicamente, close se puede usar con todos los descriptores de archivos (sockets, pipes, archivos) mientras que open es la función especializada para crear descriptores para archivos normales, al igual que socket y pipe sería para sus respectivos archivos no regulares.

    – SpectreVert

    20 de enero a las 17:12


En Visual Studio 2015

#include <corecrt_io.h>

parece funcionar!

  • La pregunta no mencionó VS.

    – SpectreVert

    20 de enero a las 17:07

¿Ha sido útil esta solución?