C ++, windows-> linux портирование, проблема с mapfile - PullRequest
0 голосов
/ 25 января 2009

Я портирую небольшое консольное приложение C ++ из Windows в Linux, GCC 4.3.2. При компиляции я получаю странную ошибку, которую не могу решить.

Labels.cpp: In function ‘void DumpSymbols()’:
Labels.cpp:68: error: invalid conversion from ‘int’ to ‘std::_Ios_Openmode’
Labels.cpp:68: error:   initializing argument 2 of ‘std::basic_ofstream<_CharT, _Traits>::basic_ofstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]’

Labels.cpp:

#include <string>
#include <fstream>
#include <iostream>
#include "stdafx.h"
using namespace std;

#include "Opcodes.h"
#include "Labels.h"


Label LABELS[1024];
int labelcounter = 0;
int OffsetCounter = 0;

void AddLabel(string name, int line)
{
        LABELS[labelcounter].name = name;
        LABELS[labelcounter].line = line;
        LABELS[labelcounter].offset = OffsetCounter;
        printf("Adding label: %s[0x%X]\n", name.c_str(), OffsetCounter);
        labelcounter++;
}

bool IsLabel(string name)
{
        for(int i=0;i<labelcounter;i++)
        {
                if (LABELS[i].name.compare(name) == 0)
                {
                        return true;
                }
        }
        return false;
}

int GetOffset(string lbl)
{
        for(int i=0;i<labelcounter;i++)
        {
                if (LABELS[i].name.compare(lbl) == 0)
                {
                        printf("Refers to label '%s':0x%X\n", lbl.c_str(), LABELS[i].offset);
                        return LABELS[i].offset;
                }
        }
        return -1;
}

void DumpSymbols()
{
        ofstream mapfile("symbols.map", ios::out|ios::beg);  //this line causes error

        //mapfile.write(
        char numbuf1[32];
        itoa(labelcounter, numbuf1, 10);
        mapfile.write((string(numbuf1) + "\n").c_str(), strlen(numbuf1)+1);

        for(int i=0;i<labelcounter;i++)
        {
                string dump;
                char numbuf[32];
                itoa(LABELS[i].offset, numbuf, 10);
                dump = string(LABELS[i].name) + "\t" + string(numbuf) + "\n";
                mapfile.write(dump.c_str(), strlen(dump.c_str()));
        }
}

stdafx.h:

#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <cstdlib>

Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 января 2009

Просто удалите "| ios :: beg":

ofstream mapfile ("symbols.map", ios :: out);

Это тип ios_base :: seekdir, который не является режимом открытия; это для поиска позиции. В любом случае, вы будете автоматически в начале.

1 голос
/ 25 января 2009

Является ли ios :: beg действительно допустимым значением параметра mode конструктора ofstream?

Согласно http://www.cplusplus.com/reference/iostream/ofstream/ofstream.html это не так.

Полагаю, произошло то, что вы случайно заимствовали его из вызова ofstream :: seekg (где он является допустимым параметром), чтобы убедиться, что запись начнется с начала файла, а не с его конца.

Если вы пытаетесь принудительно заменить файл, если он уже существует, попробуйте использовать ios :: trunc вместо ios :: beg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...