c語言文件操作,讀取二進制文件發現0x1A讀取不了

1.  發現讀到0x1A的時候 文件無法往下讀取

參考:

         這種現象目前只發現存在於windows中,unix/linux沒有。爲什麼會這樣呢?

        0x1A在ASCII碼中代表EOF,在過去,ASCII碼EOF曾經在unix/linux中被作爲文件結束符使用,微軟繼承了這個傳統,也以EOF作爲文件的結束符,不過,筆者手裏的一些資料表明,微軟在dos5.0以後就拋棄了這種做法。但實際情況是,筆者在dos6.22、windows3.1、windows3.2、windows9x、windows2k、xp、2003都存在這種問題。同時,這種問題是系統還是庫函數造成的也有待進一步查證,由於沒有源碼,無法證實,如果哪位朋友有這方面的資料,希望可以共享。另一方面,鑑於dos/windows下所有主流編譯器例如VC、BCB、gcc、tc2.0、bc3.1等都是同樣的結果,筆者傾向於這是系統原因造成的。

大部分的系統都會發生這樣的情況。

解決方法就是:

   如何解決這個問題?其實標準已經給出了其中一種解決方法,由於二進制方式的輸入輸出是一一對應的,字符不會產生變化,那麼用二進制讀取就不會產生這個問題,事實也證明是可以的,只是存在一點麻煩,由於windows下會把/n轉換爲/r/n,二進制讀取時必須對此轉換進行堙別和還原,這會增加代碼的複雜性,這種麻煩很讓人討厭。因此筆者嘗試在低級函數中尋找更好的答案,但讓人失望的是幾款主流編譯器的低級函數即使在文本方式下都沒有對/r/n進行轉換,由於低級函數的行爲跟標準無關,如果有哪款編譯器的低級函數對/r/n進行了還原,那就是比二進制方式更好的解決方法。

        但無論如何,以上方法都不完美,這是否意味着windows的文本方式沒有任何意義?這實在讓人沮喪。如果哪位朋友對此有深入的研究,歡迎一起討論。

2.大小端轉換的問題:

檢查大小端:

int checkCPU( )
{
    {
           union w
           {  
                  int a;
                  char b;
           } c;
           c.a = 1;
           return(c.b ==1);
    }
}返回1代表小端,返回0代表大端。

轉換函數還沒找到。

3.對齊

結構體對齊需要使用pack()

#pragma pack(1)
typedef struct _FDT_RawDataHeader_
{
    WORD        wSize;


    BYTE        byReserved[6];


    ULONGLONG   ullSystemTime;


} FDT_RawDataHeader, *PFDT_RawDataHeader;
#pragma pack()


4.fopen後面跟的路徑如果有\要換成\\

如果是當前目錄則使用.\\如果是上一級目錄則是..\\

5.顯示所有文件名的參考代碼

#include<iostream>   
  #include<string>   
  #include<io.h>   
  using namespace std; 


  void   filesearch(string path,int layer)   
  {   
          struct _finddata_t   filefind;   
          string  curr=path+"\\*.*";   
          int   done=0,i,handle;   
          if((handle=_findfirst(curr.c_str(),&filefind))==-1)
  return; 
   
          while(!(done=_findnext(handle,&filefind)))   
          {   
          printf("測試的--%s\n",filefind.name);
                  if(!strcmp(filefind.name,"..")){
                  //文件爲返回上一級不處理
  continue;
                  }
                  
                  for(i=0;i<layer;i++)
  cout<<"     "; 
   
   
   
   
                  if   ((_A_SUBDIR==filefind.attrib))   //如果該文件是文件夾
                  {           
  printf("----------%s\n",filefind.name);    
                          cout<<filefind.name<<"(dir)"<<endl;   
                          curr=path+"\\"+filefind.name;   
                         filesearch(curr,layer+1);   
                  }   
                  else     
                  {   
                          cout<<filefind.name<<endl;   
                  }   
          }           
          _findclose(handle);               
  }   
  int   main()   
  {           
          string   path;   
          cout<<"請輸入目錄"<<endl;   
          cin>>path;   
          filesearch(path,0);   
          system("PAUSE");   
          return   0;   
  }   
  用c++寫的


發佈了66 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章