【问题标题】:How can I split a file?如何拆分文件?
【发布时间】:2020-07-17 02:49:49
【问题描述】:

我正在尝试拆分文件的代码

#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;

int main()
{
int dim,k=1;
double x,y,x1,y1;
vector<double> AUX1[0],AUX2[0];
string file="ne_1417.dat",number; 
ifstream IN(file);
while(IN >> x >> y)
{
    AUX1.push_back(x);
    AUX2.push_back(y);
}
IN.close(); 
dim=AUX1.size();
number=to_string(k);
ofstream OUT(number+file);
for(int i=0;i<dim;i++)
{
    OUT<<AUX1[i]<<" "<<AUX2[i]<<endl;   
    if((AUX1[i+1]-AUX1[i])>50.){
         k++;
        number=to_string(k);
        OUT.close();        
        ofstream OUT(number+file);
    }
}

return 0;
}

我得到了我想要的文件数量,但只有第一个文件充满了数据,其他的都是空的,我不明白为什么 =( 我需要帮助,请

【问题讨论】:

  • 此问题中显示的代码无法满足 stackoverflow.com 对minimal reproducible example 的要求,因此这里的任何人都不太可能确定问题所在。这个问题必须是edited 以显示一个最小示例,不超过一两页代码(“最小”部分),任何人都可以剪切/粘贴、编译、运行和重现所描述的问题(“可重现”部分)完全如图所示(这包括任何辅助信息,例如程序的输入)。请参阅How to Ask 了解更多信息。
  • 你的任务是什么?为什么要实现自己的Vector 类而不是使用std::vector?你的Vector 类是否实现了边界检查,当你越界时它会做什么(就像你对AUX1(i+1) 所做的那样,假设你使用函数调用运算符而不是更自然的索引运算符进行索引[])?
  • 对不起,我是新手。我使用我的Vector 课程只是为了我的家庭作业。它没有任何特殊的东西。
  • vector&lt;double&gt; AUX1[0],AUX2[0]; 不会像你认为的那样做。查看向量的使用情况。您正在声明长度为零的向量数组。

标签: c++ string file split fstream


【解决方案1】:

问题在于范围和变量阴影。

您在函数范围内有一个名为OUT 的变量,在编写循环之前定义。然后在if 中定义一个new 和完全不同的变量OUT。当块的作用域结束时,新变量的生命周期也结束了,它被破坏了。

你不应该定义一个新的变量,而应该重新打开现有的文件:

if((AUX1[i+1]-AUX1[i])>50.){
     k++;
    number=to_string(k);
    OUT.close();        
    OUT.open(number+file);  // Open the new file
}

所有大型编译器都应该能够检测到变量遮蔽并发出警告。如果您没有收到这样的警告,那么您需要启用更多警告(我推荐 -Wall -Wextra -Wpedantic 用于 GCC 和 Clang,/W4 用于 VC++)。

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多