Pregunta

ifstream::tellg() está volviendo -13 para un determinado archivo.

Básicamente, me escribió una utilidad que analiza algo de código fuente; Abro todos los archivos por orden alfabético, comienzo con "Apple.cpp" y funciona perfectamente .. Pero cuando se pone a "Conversion.cpp", siempre en el mismo archivo, después de leer una línea con éxito tellg () devuelve -13.

El código en cuestión es:

for (int i = 0; i < files.size(); ++i) { /* For each .cpp and .h file */
   TextIFile f(files[i]);
   while (!f.AtEof()) // When it gets to conversion.cpp (not on the others)
                      // first is always successful, second always fails
      lines.push_back(f.ReadLine());

El código para AtEof es:

    bool AtEof() {
        if (mFile.tellg() < 0)
            FATAL(format("DEBUG - tellg(): %d") % mFile.tellg());
        if (mFile.tellg() >= GetSize())
            return true;

        return false;
    }

Después de que se lee con éxito la primera línea de Conversion.cpp, siempre bloquea con DEBUG - tellg(): -13.

Esta es toda la clase TextIFile (Escribe por mí, el error puede estar allí):

class TextIFile
{
public:
    TextIFile(const string& path) : mPath(path), mSize(0) {
        mFile.open(path.c_str(), std::ios::in);

        if (!mFile.is_open())
            FATAL(format("Cannot open %s: %s") % path.c_str() % strerror(errno));
    }

    string GetPath() const { return mPath; }
    size_t GetSize() { if (mSize) return mSize; const size_t current_position = mFile.tellg(); mFile.seekg(0, std::ios::end); mSize = mFile.tellg(); mFile.seekg(current_position); return mSize; }

    bool AtEof() {
        if (mFile.tellg() < 0)
            FATAL(format("DEBUG - tellg(): %d") % mFile.tellg());
        if (mFile.tellg() >= GetSize())
            return true;

        return false;
    }

    string ReadLine() {
        string ret;
        getline(mFile, ret);
        CheckErrors();
        return ret;
    }

    string ReadWhole() {
        string ret((std::istreambuf_iterator<char>(mFile)), std::istreambuf_iterator<char>());
        CheckErrors();
        return ret;
    }

private:
    void CheckErrors() {
        if (!mFile.good())
            FATAL(format("An error has occured while performing an I/O operation on %s") % mPath);
    }

    const string mPath;
    ifstream mFile;
    size_t mSize;
};

Plataforma es Visual Studio, 32 bits, Windows.

Editar:. funciona en Linux

Editar: He encontrado la causa: los finales de línea. Tanto la conversión y Guid y otros tenían \ n en lugar de \ r \ n. Yo los salvé con \ r \ n lugar y funcionó. Sin embargo, esto no debe suceder es?

¿Fue útil?

Solución

Es difícil de adivinar sin saber exactamente lo que está en Conversion.cpp. Sin embargo, utilizando < con las posiciones de transmisión no está definido por la norma. Es posible que desee considerar una conversión explícita de tipo entero correcta antes de formatearlo; No sé lo que el formato FATAL y format() esperan para llevar a cabo o cómo se sobrecarga el operador %. Stream posiciones no tienen que asignar de manera predicatable a números enteros, luego, no si el archivo no se abre en modo binario.

Es posible que desee considerar una implementación alternativa para AtEof(). Diga algo como:

bool AtEof()
{
    return mFile.peek() == ifstream::traits_type::eof();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top