无法在文件C ++上写字符串

时间:2019-09-03 01:31:42

标签: c++ c++14 ofstream

我正在尝试模拟32位的移位寄存器。但是我什至无法写文件,无论是输入还是输出。它只是运行文件并关闭。那里没有写任何东西。在这里尝试了一些解决方案,但到目前为止没有任何效果。输入的是这样的32位字符串

“ 00000000000000000000000000000000000011”。

输出应如下所示

“ 00000000000000000000000000001100”。

向左移动两位。我尚未完成转换,我想了解为什么它没有显示任何内容。

这很奇怪,我以相同的方式创建了32位多路复用,并且效果很好。

void deslocador::shift(std::vector<std::string> entrada)
{
std::ofstream shifter("shift_left2.tv", std::ofstream::out);
std::vector<std::string> saida;

if(shifter.is_open())
{
    for(unsigned int i = 0; i < 3; i++)
    {
        saida[i] = entrada[i];
        saida[i].erase(saida[i].begin());
        saida[i].erase(saida[i].begin());
        saida[i] += "00";

        shifter << entrada[i] << "_" << saida[i] << std::endl;
    }

}else
    {
        std::cout << "Couldn't open file!";
    }

shifter.close();
}

2 个答案:

答案 0 :(得分:3)

std::vector<std::string> saida;

这将实例化一个新向量。像所有新的向量一样,它完全是空的,并且不包含任何值。

for(unsigned int i = 0; i < 3; i++)
{
    saida[i] = entrada[i];

这会为saida[0]saida[3]分配四个值。不幸的是,正如我们刚刚发现的,saida向量完全为空,不包含任何内容。这会尝试将新值分配给向量中不存在的值,因此这是未定义的行为,几乎可以保证会导致崩溃。

此外,没有尝试验证entrada向量是否至少包含四个值,这将是未定义行为和崩溃的另一个原因。

尚不清楚所显示代码的意图是什么,因此不可能提供修复它的任何建议。代码说明与内容不符。目前尚不清楚“ 32位”与字符串向量之间可能存在或不具有四个值的关系。

唯一可以确定的是,由于程序由于未定义的行为而崩溃,因此没有输出。在向向量中的第i个元素分配值之前,第i个元素必须已经存在。在显示的代码中没有。这会导致不确定的行为并导致崩溃。

有多种方法可以在向量中放置新值。可以resize() d向量,也可以push_back()将新值向量化。目前尚不清楚在这种情况下应采取的措施,因此,有关其他信息和示例,请参阅C ++书,以便您可以进一步了解这两种方法(以及其他方法)的工作方式,从而可以决定自己想做什么。试图做。

答案 1 :(得分:0)

这就是我要做的工作!

void deslocador::shift(std::vector<std::string> entrada)
{
    std::ofstream shifter("shift_left2.tv", std::ofstream::out);
    std::vector<std::string> saida;
    saida.resize(entrada.size());

    if(shifter.is_open())
    {
        for(unsigned int i = 0; i < entrada.size(); i++)
        {
            saida[i] = entrada[i];
            saida[i].erase(saida[i].begin());
            saida[i].erase(saida[i].begin());
            saida[i] += "00";

            shifter << entrada[i] << "_" << saida[i] << std::endl;
        }

    }else
        {
            std::cout << "Couldn't open file!";
        }

    shifter.close();
}