2016-06-22 73 views
0

我有一個奇怪的問題,從<algorithm>標題的set_differences函數。我試圖逐行閱讀兩個文本文件,並將每行放入相應的集合中。出於某種原因,雖然絕大多數肯定存在,但set-difference沒有檢測到兩組之間的差異。當我硬編碼填充兩套它工作得很好。它必須是從文件中讀取字符串的內容,但我無法弄清楚什麼。std :: set_Differences不能讀取文件

#include <stdio.h>  
#include <stdlib.h>  
#include <iostream> 
#include <fstream> 
#include <set> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 
#include <string> 

std::set<std::string> listOfFiles(std::string fileName) { 
    std::ifstream tempFile; 
    tempFile.open(fileName.c_str()); 
    std::string X; 
    std::set<std::string> fileNameSet; 
    if (tempFile.is_open()) { 
     while (std::getline(tempFile, X)) { 
      fileNameSet.insert(X); 
     } 
    } 
    else { 
     std::cerr << "Failed to open " + fileName + "\n"; 
     exit(0); 
    } 
    return fileNameSet; 
} 
std::set<std::string> setDifferences(std::set<std::string> a, std::set<std::string> b) { 
    using namespace std; 
    set<string> result; 
    set_difference(a.begin(), a.end(), b.begin(), b.end(), inserter(result, result.begin())); 
    cout << "Difference" << endl << "-------------" << endl; 
    for (set<string>::const_iterator i = result.begin(); i != result.end(); ++i) { 
     cout << *i << endl; 
    } 
    return result; 
} 
int main() 
{ 
    std::set<std::string> initialSet = listOfFiles("test1.txt"); 
    std::set<std::string> afterNGD = listOfFiles("test2.txt"); 
    std::set<std::string> result, result2; 
    std::set<std::string> a, b; 
    a.insert("one"); 
    a.insert("two"); 
    a.insert("three"); 
    b.insert("a"); 
    b.insert("b"); 
    b.insert("three"); 

    //Fails: result is empty 
    result = setDifferences(initialSet, afterNGD); 


    //Pass: result2 constains strings "one" and "two" 
    result2 = setDifferences(a,b); 
    return 0; 
} 

我的文本文件包含: test1.txt的

.Xil 
fileNames.txt 
hostlistfile.txt 
ipcore_dir 
iseconfig 
item.prj 
item.sch 
item.sym 
item.syr 
item.ucf 
item.vhf 
item.xdl 
item.xst 
item_bitgen.xwbt 
item_guide.ncd 
item_summary.html 
pa.fromNcd.tcl 
planAhead.ngc2edif.log 
planAhead_pid11956.debug 
planAhead_pid1272.debug 
planAhead_pid16492.debug 
planAhead_pid19040.debug 
planAhead_pid7804.debug 
planAhead_pid9888.debug 
planAhead_run_1 
planAhead_run_2 
sch2HdlBatchFile 
SingleItemTest.gise 
SingleItemTest.tcl 
SingleItemTest.xise 
template files 
templates 
xst 
_xmsgs 

text2.txt:

.Xil 
fileNames.txt 
hostlistfile.txt 
ipcore_dir 
iseconfig 
item.bld 
item.lso 
item.ngc 
item.ngd 
item.ngr 
item.prj 
item.sch 
item.sym 
item.syr 
item.ucf 
item.vhf 
item.xdl 
item.xst 
item_bitgen.xwbt 
item_guide.ncd 
item_ngdbuild.xrpt 
item_summary.html 
item_vhdl.prj 
item_xst.xrpt 
pa.fromNcd.tcl 
planAhead.ngc2edif.log 
planAhead_pid11956.debug 
planAhead_pid1272.debug 
planAhead_pid16492.debug 
planAhead_pid19040.debug 
planAhead_pid7804.debug 
planAhead_pid9888.debug 
planAhead_run_1 
planAhead_run_2 
sch2HdlBatchFile 
SingleItemTest.gise 
SingleItemTest.tcl 
SingleItemTest.xise 
template files 
templates 
xlnx_auto_0_xdb 
xst 
_ngo 
_xmsgs 
+1

在讀完文件後,您是否檢查'initialSet'的內容是否正確? – BlackMamba

+1

[mcve]會非常方便,重點在於最小化。這兩個文件中導致此問題的最小數據集是什麼?擺脫I/O代碼並直接使用這些最小數據初始化這些集合。如果你不能最小化程序並且仍然有'set_difference'失敗,那麼它就不能成爲問題,你應該儘量減少不同的方向。 – chris

回答

1

reference

副本從排序的元素範圍[first1,last1)這是 沒有找到在排序的範圍[first2,last2)到在d_first從 開始的範圍。

從你的文件,例如,在text1.txt所有元素中可以找到text2.txt,因此如預期的輸出。