g ++打印了不受欢迎的00000,为什么?

时间:2018-03-03 23:18:35

标签: c++

以下是我的代码;

int main(){
    ifstream infile;
    infile.open(fin);

    ofstream outfile;
    outfile.open(fout);

    char c; 
    int input_order = 0;
    string comp_str = "";
    vector <string> pfx_str;

    srand(time(NULL));

    if (infile.fail())
    {
        cout << "cannot open file!" << endl;
        return 0;
    }

    while (!infile.fail())
    {
        cout << input_order << endl;

        c = infile.get();

        if (c == '\n')
        {
            if (strcmp(comp_str.c_str(), "") != 0)
            {
                pfx_str.push_back(comp_str);
            }


            int num = rand() % pfx_str.size();

            while (num == 0)
            {
                num = rand() % pfx_str.size();
            }

            for (int i = 0; i < num; i++)
            {
                outfile << "/" << pfx_str.at(i);
            }
            outfile << "\n";

            input_order++;
            pfx_str.clear();
        }
        else if (c == '/')
        {
            if (comp_str != "")
            {
                pfx_str.push_back(comp_str);
            }
            comp_str = "";
        }
        else
        {
            comp_str = comp_str + c;
        }
    }

    infile.close();
    outfile.close();

    return 0;
}

对于由10k输入组成的小组,它可以工作。 但是,对于诸如使用1600k输入的大集合,它打印出00000,并且不起作用。是什么让它发生了?以及如何使其正常工作? (以前,我使用此代码进行1600k输入,它可以正常工作....) 在编译中,我使用了g++ -std=gnu++0x ....。 我用谷歌搜索了这个问题,但找不到正确的答案..而且我也无法弄清楚这个问题来自哪个......

谢谢,

+ 此代码用于随机剪切输入。

这是1输入集的示例; (显示输入模式) / AA / AB / BC / AAA / 在这里,我将'aa','ab','bc'和'aaa'视为一个组成部分。 我希望随机剪切此输入作为组件单元。 这是代码的简短步骤; 1.生成随机数(0除外) 2. ex)我使用上面的输入,随机数是2。   然后我切断了这个输入,只剩下'2'组件,这是/ aa / ab / (对输入文本文件中的每个输入重复此过程

=&GT;这个输入; / AA / AB / BC / AAA /    (在里面,它产生随机数2)         输出要打印在输出文件中; / AA / AB /

1 个答案:

答案 0 :(得分:0)

您的代码没有任何问题。

我更新了你的代码,以便用g ++编译:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main(){
    ifstream infile;
    infile.open("fin.txt"); // substituted a real file name in here to test

    ofstream outfile;
    outfile.open("fout.txt"); // ditto here

......其余部分与上面提到的相同。

将其命名为test.cpp,并使用以下命令编译:

  

g ++ -lm test.cpp -o test.exe

我编写了一个Ruby脚本,根据您在注释中指定的测试集创建输入文件:

#!/usr/bin/env ruby

File.open( 'fin.txt', 'w') do |f|

    1600000.times do
        f << "/aa/ab/bc/aaa/\n"
    end

end

然后我运行了已编译的程序test.exe,并且你完全欠我一杯啤酒,看你的行号是那么高。这是我生命中花费的时间,我永远不会回来。

并通过

获得了预期的fout.txt
/aa
/aa/ab
/aa
/aa/ab
/aa/ab/bc
/aa/ab/bc
/aa/ab
/aa/ab/bc
/aa/ab

我的猜测是你的系统约束导致系统故障。我在具有大量内存等的典型台式机上运行它。如果您在嵌入式系统上运行它,它可能没有类似的资源。在这一点上,我很想在Raspberry Pi上测试,但我已经在这上面花了太多时间。只要知道您的代码没有任何问题

将来,请尝试找出您的编码问题。 Stack Overflow是非常宽容的,如果你真的尝试过并且无法弄清楚解决方案,但是你需要展示你尝试过的东西以及结果发生了什么。对于像这样开始的问题,你认为你试图找出算法问题,总是给出数据集和发生的意外结果。

祝你好运!