2016-03-25 65 views
1

我想將我的一箇舊程序從C移植到C++。我無法提供代碼來完成解析文件的每一行(用分號分隔)的任務。我知道要將每行讀入一個字符串,我應該使用std :: getline()並且還讀取涉及stringstream的解決方案。但是,就解析行爲單個變量而言,我已經失去了。以前,在C中,我使用了sscanf()。這是我的舊代碼...如何在C++中「sscanf」?

void loadListFromFile(const char *fileName, StudentRecordPtr *studentList) { 
    FILE *fp; // Input file pointer 
    StudentRecord student; // Current student record being processed 
    char data[255]; // Data buffer for reading line of text file 

    // IF file can be opened for reading 
    if ((fp = fopen(fileName, "r")) != NULL) { 
     // read line of data from file into buffer 'data' 
     while (fgets(data, sizeof(data), fp) != NULL) { 
      // scan data buffer for valid student record 
      // IF valid student record found in buffer 
      if (sscanf(data, "%30[^,], %d, %d, %d, %d, %d, %d, %d", student.fullName, &student.scoreQuiz1, 
       &student.scoreQuiz2, &student.scoreQuiz3, &student.scoreQuiz4, &student.scoreMidOne, 
       &student.scoreMidTwo, &student.scoreFinal) == 8) { 
       // Process the current student record into the student record list 
       processStudentToList(student, studentList); 
      } 
     } 
    } 
    else { 
     // Display error 
     puts("**********************************************************************"); 
     puts("Could not open student record file."); 
     puts("**********************************************************************"); 
    } 
    // Close file 
    fclose(fp); 
} 

而我目前的代碼,因爲我在這個問題上停滯不前。

void Database::loadFromFile(const string filename) { 
    ifstream file(filename); 
    string data; 
    if (file.is_open()) { 
     cout << "Sucessfully loaded " << filename << ".\n" << endl; 
     while (getline(file, data)) { 
      // 
     } 
    } 
    else { 
     cerr << "Error opening input file.\n" << endl; 
    } 
} 

我非常感謝C++的任何洞察力等同於這種方法。

編輯:這被標記爲重複的帖子不回答我的問題。該解決方案不考慮分號(或任何字符)分隔的字符串。

回答

1

我相信這是你所追求的: What should I use instead of sscanf?

​​
+0

我已閱讀此解決方案,但不確定如何使用此字符串由分號和非空格分隔。 – Cam

+0

哦,我現在看到了問題。好吧,讓我試試幾件事:) – ddeunagomez

+2

@Cam也許這就是你要找的東西? http://stackoverflow.com/questions/11719538/how-to-use-stringstream-to-separate-comma-separated-strings – yano

0

您可以使用std::getline和使用您的分隔符,它:

例子:
與內容的文件 「name,id,age

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

int main() 
{ 
    std::ifstream in_file("file", std::ios::in); 
    if (!in_file.is_open()) { 
     std::cerr << "File not open" << '\n'; 
     return -1; 
    } 

    std::vector<std::string> vec; 
    std::string word; 
    while (std::getline(in_file, word, ',')) { 
     vec.emplace_back(word); 
    } 
    for (const auto& i : vec) 
     std::cout << i << '\n'; 
} 

將輸出:

name 
id 
age 

您可以使用它將其存儲到變量中。