2017-08-31 25 views
0

我有4行3列如何打印二维对向量的值?

(0.165334,0) (0.166524,-0.0136064) (-0.144899,0.0207161) 
(0.205171,0) (0.205084,-0.0139042) (-0.205263,0.0262445) 
(0.216684,0) (0.215388,-0.0131107) (-0.193696,0.0251303) 
(0.220137,0) (0.218849,-0.0135667) (-0.194153,0.025175) 

我写了下面的代码打印的FFTfile值的文本文件。该脚本不会引发任何错误,但不会打印值。任何想法什么是错的?

#include <iostream> 
#include <stdio.h> 
#include <fstream> 
#include <stdlib.h> 
#include <math.h> 
#include <vector> 
#include <algorithm> 
#include <dirent.h> 
#include <string> 
#include <sstream> 
using namespace std; 

class Point 
{ 
public: 
    double x; 

    double y; 

    friend istream& operator>>(istream& input, Point& p); 
    friend ostream& operator<<(istream& s, Point& p); 

    double getX(void); 

    double getY(void); 


}; 

    double Point::getX(void){ 
     return x; 
     } 

    double Point::getY(void){ 
     return y; 
     } 

istream& operator>>(istream& input, Point& p) 
{ 
    char c; 
    input >> c; // Read open parenthesis 
    input >> p.x; 
    input >> c; // Read comma 
    input >> p.y; 
    input >> c; // Read closing parenthesis 

    return input; 
}; 

ostream& operator<<(ostream& s, Point& p) 
{ 
    s << p.getX() << ", " << p.getY(); 
    return s; 
} 

vector<vector<Point> > LoadFFT(string path){ 
    string Filename; 
    vector<vector<Point> > matrix; 
    Filename.append(path);                 
    Filename.append("....txt"); 
    ifstream fileFFT(Filename.c_str()); 
    string raw_text; 
    while(getline(fileFFT, raw_text)){ 

     vector<Point> row; 
     istringstream(raw_text); 
     Point p; 
     while(raw_text >> p){ 
      row.push_back(p); 

     } 

    matrix.push_back(row); 
    } 

return(matrix); 
} 

int main(){ 
    vector<vector<Point> > FFTfile=LoadFFT("..."); 

    for (int i = 0; i < FFTfile.size(); i++) 
    { 
     for (int j = 0; j < FFTfile[i].size(); j++){ 
      cout << FFTfile[i][j]; 
     } 

    } 

    return(0); 
} 
+0

你永远不会测试文件是否成功打开。你怎么能确定该文件实际打开? – Fureeish

+0

我只是一个小菜人!用C/C++经验还不到一个月,你能帮上忙吗? – Spandy

+0

你缺乏经验并不能让你受到不同的待遇。我建议检查文件打开是否成功。你有没有试过检查你的程序是否适用于它? – Fureeish

回答

2

如果文件成功打开,一个问题似乎是下列设置的行:

istringstream(raw_text); 
    Point p; 
    while(raw_text >> p) 

您还没有建立在你在哪里发出>>调用点std::istringstream对象。相反,临时对象被创建并立即销毁。

这应该是:

istringstream strm(raw_text); 
    Point p; 
    while(strm >> p) 

话虽如此,我很惊讶,没有错误编译的代码。

+0

与你一起惊喜。仍试图找出那一个。它看起来像是'istringstream(raw_text);'是被看作是'istringstream raw_text;'并且允许编译。例如:https://godbolt.org/g/CTcWw6为什么呢,我会留给那些比我更擅长语言的细节的人。 – user4581301

+0

@ user4581301你问过吗?我也想了解它...... – bezet

+0

奇怪,因为这里是OP的代码(有一些变化),[编译成功](https://godbolt.org/g/kXWsvb)。 – PaulMcKenzie

1

您不加载文件。您拨打:LoadFFT("...")函数的结果文件名为:....... txt这不是有效的文件名。 stringstream变量(重新)定义是错误的,不需要中间字符串,也不需要它们的对应关系。蒸馏LoadFFT()功能是:

vector<vector<Point>> LoadFFT(const char* path){ 
    vector<vector<Point> > matrix; 
    ifstream fileFFT(path); 
    string raw_text; 
    while (getline(fileFFT, raw_text)){ 
     vector<Point> row; 
     istringstream iss(raw_text); 
     Point p; 
     while (iss >> p){ 
      row.push_back(p); 
     } 
     matrix.push_back(row); 
    } 
    return(matrix); 
} 

修改后的main()功能,允许每行后的新行:

int main(){ 
    vector<vector<Point> > FFTfile = LoadFFT("myfile.txt"); 
    for (size_t i = 0; i < FFTfile.size(); i++){ 
     for (size_t j = 0; j < FFTfile[i].size(); j++){ 
      cout << FFTfile[i][j]; 
     } 
     cout << std::endl; 
    } 
} 

这些标题,您需要:

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

您可以删除其他。

1

您正在使用raw_text(string)作为istream类型的输入参数。我不认为这种转换是可能的。 尝试使用istringstream返回值作为“< <”的参数或更改您的代码,以便从文件直接复制到您的矩阵。

编辑:上面的评论做得更好解释它