C ++,windows-> linux移植,mapfile问题

时间:2009-01-25 15:00:17

标签: c++ windows linux

我正在将一个小型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 个答案:

答案 0 :(得分:2)

只需删除“| ios :: beg”:

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

它的类型是ios_base :: seekdir,它不是开放模式;这是为了寻找一个位置。无论如何,你将自动处于起步阶段。

答案 1 :(得分:1)

ios ::是否真的是ofstream构造函数的mode参数的有效值?

根据http://www.cplusplus.com/reference/iostream/ofstream/ofstream.html,它不是。

我想发生的事情是你不小心从对ofstream :: seekg(它是一个有效参数)的调用中借用它来强制写入将从文件的开头而不是结束开始。< / p>

如果您尝试强制将文件完全替换(如果已存在),请尝试使用ios :: trunc而不是ios :: beg。