2015-08-14 615 views
0

TL; DR我正在尝试获取数据流并将其写入.csv文件。除了写作部分外,一切都已经解决了,我认为这只是由于我没有正确引用.csv文件。但我是这个东西的新手,并不知道如何正确引用它,所以我需要帮助。使用C++写入.csv文件?

大家好,我非常感谢任何能够帮助我的人!一些高级信息,我的IDE是Xcode,使用C++,我使用Thalmic Labs的Myo臂章作为收集数据的设备。有一个program(有兴趣查看它的链接)应该将EMG,加速度计,陀螺仪和方向值流入.csv文件。我非常接近让应用程序工作,但是我缺乏编程经验终于赶上了我,而我陷入了一件相当简单的事情。我知道应用程序可以传输数据,因为我已经能够在调试区域中打印EMG值。我也可以得到应用打开.csv文件,使用此代码:

const char *path= "/Users/username/folder/filename"; 
std::ofstream file(path); 
std::string data("data to write to file"); 
file << data; 

但没有数据最终被流/打印成文件,我结束程序之后。我认为唯一可能导致这种情况的是打印功能不正确引用此文件路径。我认为这是一个简单的事情,但就像我说的,我没有经验,并且不知道如何解决这个问题。我不知道还有哪些其他信息是必要的,所以我只提供我想象中可能有用的所有内容。

这是功能结构,是应该打开文件(注:该应用程序的目的是在同一个目录中打开该文件作为本身)

void openFiles() { 
    time_t timestamp = std::time(0); 

    // Open file for EMG log 
    if (emgFile.is_open()) 
    { 
     emgFile.close(); 
    } 
    std::ostringstream emgFileString; 
    emgFileString << "emg-" << timestamp << ".csv"; 
    emgFile.open(emgFileString.str(), std::ios::out); 
    emgFile << "timestamp,emg1,emg2,emg3,emg4,emg5,emg6,emg7,emg8" << std::endl; 

这是助手打印加速度计和陀螺仪的数据(虽然目前没有出现像这样的东西打印肌电图的数据,但我知道它,所以... Watevs):

void printVector(std::ofstream &path, uint64_t timestamp, const myo::Vector3<float> &vector) 
{ 
    path << timestamp 
    << ',' << vector.x() 
    << ',' << vector.y() 
    << ',' << vector.z() 
    << std::endl; 
} 

这是功能结构,利用辅助:

void onAccelerometerData(myo::Myo *myo, uint64_t timestamp, const myo::Vector3<float> &accel) 
{ 

    printVector(accelerometerFile, timestamp, accel); 

} 

我与Thalmic实验室,他说这听起来像,除非应用程序只是完全坏了,我可能只是具有的权限问题(谁做的应用程序实际上是人)的一名工作人员讲我的电脑。这台计算机上有多个用户,所以很可能是这种情况,尽管我当然不希望这样,而且我还想在再次投入之前再试一次。再次,感谢任何可以帮助的人! :)

+3

你检查过文件['is_open()'](http:// en .cppreference.com/w/cpp/io/basic_ofstream/is_open)? – NathanOliver

+1

您可以提供[MCVE](http://stackoverflow.com/help/mcve)? – caps

+1

您正在使用相对路径来打开文件,如果你的工作目录不包含这些目录,而不是简单地创建它们,文件打开操作将失败。使用绝对路径,只是一个文件,或者使用文件系统操纵系统(如文件系统TS或促进。文件系统)来生成适当的目录。不过,检查文件打开是否成功始终是一个好主意。你能否验证你在工作目录中是否有正确的文件,或者它在你使用文件时有效? – jaggedSpire

回答

0

我的想象力让我失望。你有没有尝试写入或读取ostringstream或istringstream对象?这可能是内容丰富的。这里有一个行是正确的:

std::ofstream outputFile(strOutputFilename.c_str(), std::ios::app); 

注意,C++不具备流的.csv代码的任何原生支持,不过,你可能不得不自己做的转换。 :(如果你用(doubled)“//”替换“/”的话,情况可能会更好...

+0

我还没有尝试过。在每个函数中伴随着ostringstream的文件名是不同的,所以我认为只有一个文件名的东西是行不通的。当我回到电脑上时,我会先尝试一下。至于“/”vs“//”,“//”ing没有效果,我确实尝试过。我并不知道C++没有自然流支持,因为我之前在PC上运行过这个应用程序,没有任何问题。在我结束该应用程序后,应该打开.csv文件,并打开其中的所有数据。 – Meagerpompnano

+0

对不起,我的意思是你可能不得不用单双'替换单'。只是因为Windows说它会读取第一种类型的路径并不意味着它会......第二,应用程序需要管理权限来读取路径..至于C++不支持.csv文件“本身” ,我的意思是如果你没有一个序列化层为你做了必要的转换,你必须自己做。 – 2015-08-14 20:03:06

+0

我不在Windows上,它的OSX。我已经得到这个应用程序在Windows上运行没有任何问题,但现在我没有访问非Mac设备,所以我坚持这一点。无论如何,不​​幸的是,我发现这个应用程序有一个更大的缺陷,渲染整个事物无用,所以现在我必须学习如何使用蓝牙实现这个相同的概念。好极了.... :( – Meagerpompnano