2016-02-26 21 views
1

我試圖讀取包含82503x1200矩陣中的雙格式化數字的文件。我正在閱讀文件,但沒有找到指定lseek正在使用的號碼大小的方法。爲什麼給我那個數字而不是文件號?C++:lseek給予原始文件不同的值:

float fd; 
float ret; 
float b; 
const size_t NUM_ELEMS = 11; 
const size_t NUM_BYTES = NUM_ELEMS * sizeof(float); 

fd = open("signal_80k.txt",O_RDONLY); 
if(fd < 0){ 
    perror("open"); 
    //exit(1); 
} 

ret = lseek(fd, seekCounter*NUM_BYTES, SEEK_SET); 
ret = read(fd, &b, sizeof(float)); 
cout<<"> " << seekCounter << ": " << b<<endl; 
seekCounter++; 
close(fd); 

它打印:

0:1.02564e-08 1:1.08604e-05 2:0.000174702 3:6.56482e-07 4:2.57894e-09

但前值: 9.402433000000000e 8.459109000000000e 8.947654000000000e + 03 9.021620000000000e

這是它的外觀在MATLAB

enter image description here

+1

你的代碼看起來像你正在閱讀的二進制數據,但你的文件擴展名是TXT這表明它是文本數據。 – Daniel

+0

嗨丹尼爾,是的,它是文本數據...這意味着lseek不是正確的方法? – Dazzid

+0

你的文本文件是怎樣的? – Daniel

回答

2

在你的意見,你澄清說,該文件包含文本數據,我的回答是基於這一點。現在,讓我們來看看文件中的第一個數字:

1.02564e-08 

有幾個字符?我計數11個字符。然後,它後面有一個空格,所以在這之後的下一個值將是第一個之後的十二個字符。

通過不定期檢查,我們發現您的代碼設置

const size_t NUM_ELEMS = 11; 

爲每列值的數量。

那麼你的代碼將

const size_t NUM_BYTES = NUM_ELEMS * sizeof(float); 

要計算每個行佔用的字符數。現在,我可能錯過了這些常量的實際含義,但無論如何,您在文件中都有一個目標值,並且您正試圖直接尋找它,這就是底線。所以,爲了這個答案的目的,我會去解釋這個問題,但答案依然如此,無論如何。

流行測驗爲你。什麼是sizeof(float)

答案:它是4字節,在大多數實現(所以我會假設前進)。因此,您計算每行將會有44個字符,並且您可以使用它來嘗試查找文件中的相應行。至少,我是如何解析你的代碼的。

問題當然是,假設每個值都以科學計數法表示,每行有11個值,每個值佔用12個字符(包括尾隨空格或換行符),每行都會實際上需要11 * 12或132個字符,而不是44.如果您使用的是使用\ r \ n作爲新行的實現O/S,請再添加一個字符。

所以,你需要做一些調整。甚至在此之後,這整個卡片的房子取決於文件中的每個值始終以科學記數法表示,並具有相同的精度。

這是一個你不能真正做出的假設。此外,這不是唯一的問題。

第二個問題是您正試圖將文件的內容直接讀入float數據類型。是的,每個float數據類型將是四個字符,因爲這是代表二進制文件中值爲float的字節數。這裏的問題是該文件不包含原始二進制數據,而是包含文本數據。

總之,我沒有在這裏看到很多選擇,只是從頭到尾閱讀文件,而不是嘗試尋找正確的位置,因爲您不能保證文件中的每個值都會佔用相同的位置字符數量;然後將文件作爲文本讀取,並使用operator>>將其內容轉換爲float值。

0

如果文件是二進制的,那麼lseek會是合適的方法嗎?

我改變做法,以這樣的:

ifstream inFile("signal_80k.txt"); 
string line; 
int count = 0 ; 
if(!inFile.is_open()) 
{ 
    cout<<"\n Cannot open the signal_80k.txt file"<<"\n"; 
} 
else 
{ 
    cout<<"loading all data... "<<"\n"; 
    while(getline(inFile , line)){ 
     vector<string> numbers = ci::split(line, " ", false); 
     for(int i = 0; i <numbers.size(); i++){ 
      try{ 
       float thisNumber = std::stof(numbers.at(i)); 
       cout<<"numbers at: " << " = "<< thisNumber <<"\n"; 
      } 
      catch (...){ 
      } 
     } 
     count++; 
     cout<<"done: "<<count<<"\n"; 
    } 
    cout<<"all data ready!"<<"\n"; 
    inFile.close(); 
}