2016-11-11 117 views
1

我有一個整數行文件。我想將每行讀入陣列中的一個插槽。我有下面的代碼,但它不起作用。我不確定我是否在正確的軌道上。從文件讀取數據並將每行存儲在數組中?

void Read_Save() { 
    ifstream in; 
    int arr[100]; 
    string line; 
    in.open("file.txt"); 
    while (in.peek() != EOF) 
    { 
     getline(in, line, '\n'); 
     strcpy(arr, line.c_str()); 
    } 
    in.clear(); in.close(); 
} 
+2

你不能輸入整數與'strcpy' – Raindrop7

+2

的陣列,同時在'而(!in.peek()= EOF)'會的工作,並在閱讀EOF陷阱之前,對你沒有陷入EOF測試中,你可能會發現'while(getline(in,line,'\ n'))'更好,因爲它爲你節省了'peek',並且捕獲了比只是EOF。 – user4581301

回答

2

有幾種方法可以從字符串中解析出整數值。

首先,讓我們來解決你的循環:

int pos = 0; 
while(std::getline(in, line) && pos < 100) 
{ 
    int value = 0; 

    // Insert chosen parsing method here 

    arr[pos++] = value; 
} 

下面是常用選項的不完全名單:

  1. 使用std::strtol

    // Will return 0 on error (indistinguishable from parsing actual 0) 
    value = std::strtol(line.c_str(), nullptr, 10 ); 
    
  2. 使用std::stoi

    // Will throw exception on error 
    value = std::stoi(line); 
    
  3. 建立一個std::istringstream並從中讀取:

    std::istringstream iss(line); 
    iss >> value; 
    if(!iss) { 
        // Failed to parse value. 
    } 
    
  4. 使用std::sscanf

    if(1 != std::sscanf(line.c_str(), "%d", &value)) 
    { 
        // Failed to parse value. 
    } 
    

現在,請注意在循環檢查pos < 100邊界測試。這是因爲您的陣列具有存儲限制。實際上,你也用Read_Save中的本地地圖覆蓋了全局地圖,因此用一個更小的數組隱藏它,當函數結束時會丟失一個更小的數組。

使用標準庫提供的其他容器類型,可以有一個任意大小的「數組」(實際上不是數組)。提供隨機訪問的有用的是std::vectorstd::deque。讓我們用向量和改變Read_Save的定義是有點更加有用:

std::vector<int> Read_Save(std::istream & in) 
{ 
    std::vector<int> values; 
    std::string line; 

    for(int line_number = 1; getline(in, line); line_number++) 
    { 
     try { 
      int value = std::stoi(line); 
      values.push_back(value); 
     } 
     catch(std::bad_alloc & e) 
     { 
      std::cerr << "Error (line " << line_number << "): Out of memory!" << std::endl; 
      throw e; 
     } 
     catch(std::exception & e) 
     { 
      std::cerr << "Error (line " << line_number << "): " << e.what() << std::endl; 
     } 
    } 

    return values; 
} 

最後,該呼叫將變爲:

std::ifstream in("file.txt"); 
std::vector<int> values = Read_Save(in); 
0

在你的情況下最好的辦法是使用std::vector。代碼如下所示:

void Read_Save() 
{ 
    std::ifstream in("file.txt"); 
    int value; 
    std::vector<int> arr; 

    while (in >> value) 
     arr.push_back(value); 

    for(int i(0); i < arr.size(); i++) 
     std::cout << arr[i] << ", "; 

    std::cout << std::endl; 
    in.close(); 
} 
+1

或者,您可以使用'std :: istream_iterator'和'std :: back_inserter'作爲迭代器來替換'std :: copy()'手動'while'循環,例如:'std :: copy(std :: istream_iterator (in),std :: istream_iterator(),std :: back_inserter(arr));' –

1

不能使用strcpy()將字符串轉換爲整數。您可以使用std::strtol()std::stoi(),甚至std::istringstream,如:

int arr[1000]; 

void Read_Save() { 
    ifstream in; 
    string line; 
    in.open("file.txt"); 
    int index = 0; 
    while ((index < 1000) && (getline(in, line))) 
    { 
     if (istringstream(line) >> arr[index]) 
      ++index; 
    } 
} 
+0

我喜歡你做它的方式。我得到這個錯誤雖然 錯誤\t C2027 \t使用未定義類型'std :: basic_istringstream ,std :: allocator Jaden

+1

您是否添加了istringstream的include?我的意思是'#包括' – drescherjm

相關問題