2015-08-14 105 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