C

[C|C++]feof使用注意

前言


有時候在使用檔案讀寫時,會遇到要判斷檔案結尾的需求,而C/C++語言在<stdio.h>中有提供一個feof()的函式幫助我們判斷,但是在使用時,請先了解它的使用時機。

發生狀況->多讀一次?


下面的寫法模式會發生多讀取的case,而這個原因在於使用feof的時機不對。

FILE* pf;
 while(!feof(pf)){
   //fread 讀取
   //資料處理
 }

feof的解讀


feof是發生在fread使用"讀取過檔案"後,已讀到End-of-file位置時,回傳的指標才會是true(檔案結尾),所以上面的寫法在讀完最後一筆後,指標會停留在End-of-file位置前,需要再讀一次到在End-of-file位置後(判斷讀取資料失敗,因為已讀到eof),才會為true,而因為fread讀取失敗,buffer的資料不會改變,所以才會多讀一筆,如下圖:

[C/C++]類別互相引用(Class include each other)

前言


最近開始久違的寫C++程式,然後因為物件上的關係,所以某個A類別會擁有B類別,同時B類別會需要知道A類別

為了能夠壤兩個類別都能夠看到,所以依照直覺的想法,會使兩方的標頭檔(Header file)都會Include彼此,但是此時編譯器卻會發生問題,究竟是為什麼呢? 這樣的想法不是很合理嗎? 

但其實編譯器在解讀時是會出現問題的,究竟哪裡有問題?

經過朋友的解說後,解決了問題也知道了原因,這邊來介紹一下給需要知道的人。

類別互相引用


有時候在開發物件導向的程式時,免不了因為一些OO關係,需要讓某個A類別會擁有B類別,同時B類別會需要知道A類別:

[C/C++] 多筆資料 二進制檔案 讀取 -使用fread

前言


此篇介紹如何對二進制檔做多筆資料的讀取,另外,若想要知道做寫入,可以參考「C/C++多筆資料的二進制檔案寫入-使用fwrite」

實作方式


首先,先讓我們來看看二進制的檔案寫入所提供的函式吧,參考C++ Reference,如下圖:

fread的函式參數,其實要填入的參數與fread一致,它的第一個參數是你所要讀取到的變數記憶體位置(也可以是陣列或結構),第二個參數是此變數的資料型態bytes大小,第三個參數是一次讀取的筆數(假若是5,就代表寫入5筆),最後是你所使用的FILE檔案指標。

那麼以下讓我們來要如何做多筆資料的讀取呢?也是和前一篇fwrite一樣也是透過尋訪方式一筆一筆讀取,如下:

product_t p_list[10];//宣告

[C/C++]多筆資料 二進制檔案 寫入-使用fwrite

前言


當我們在做C或C++語言的檔案讀寫時,時不時可能都會用到二進制的檔案讀取或寫入,而有時候我們可能會一次寫入多筆資料,如陣列,或是結構的陣列等,那麼這時候我們需要如何確保可以一次全部寫入,並一次全部讀取呢?

實作方式


此篇會先介紹寫入的部分,而若想知到讀取的部分,可以到另一篇「C/C++多筆資料的二進制檔案讀取-使用fread」來了解。

首先,先讓我們來看看二進制的檔案寫入所提供的函式吧,參考C++ Reference,如下圖

節錄至:C++ Reference-fwrite

Parallel algorithm to solve a Hamiltonian Path problem variation (Travelling Baseball Fan) (Bradley Kuszmaul)

The included source code implements a variation of the Hamiltonian Path problem, called the Travelling Baseball Fan Problem, as described in the included problem description text file. The included write-up gives an overview of Cilk++ and some of the tools available for Cilk programming. The serial algorithm is a recursive search of all paths. To this basic algorithm, two heuristics have been added to reduce search time: remaining-degree and remaining-city.

Parallel algorithm to 3-D Convex Hull Problem (Bradley Kuszmaul)

The included code and white paper provides a parallel solution for the 3-D Convex Hull problem, as described in the included problem description text file. Parallelism is achieved using Cilk++. Possible points for the convex hull are found by repeatedly selecting four points from the input set and finding the largest volumes of the formed tetrahedrons (using matrix determinants). An O(n^4) algorithm confirms those points that are actually on the convex hull from the possible points previously found.

C abonnieren