亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言中文件常見操作的示例詳解

 更新時間:2022年12月02日 08:55:11   作者:霸道小明  
FILE為C語言提供的文件類型,它是一個結構體類型,用于存放文件的相關信息。本文主要為大家介紹下C語言中幾個常見的文件操作的實現(xiàn),需要的可以參考一下

FILE為C語言提供的文件類型,它是一個結構體類型,用于存放文件的相關信息。文件打開成功時,對它作了內存分配和初始化。

每當打開一個文件的時候,系統(tǒng)會根據(jù)文件的情況自動創(chuàng)建一個FILE結構的變量,并填充其中的信息,使用者不必關心細節(jié)。

一般都是通過一個FILE的指針來維護這個FILE結構的變量,這樣使用起來更加方便。

文件打開和關閉

C語言的安全文件打開函數(shù)為_wfopen_s和_fopen_s。

errno_t _wfopen_s(
   FILE** pFile,
   const wchar_t *filename,
   const wchar_t *mode
);

參數(shù)pFile

指向文件指針的指針,該文件指針將接收指向打開文件的指針。

參數(shù)filename

表示要打開的文件名

參數(shù)mode 

表示訪問方式,該參數(shù)可設置的值如下表。

模式含義
"r"打開以供閱讀。如果文件不存在或找不到,則fopen_s調用將失敗
"w"打開一個空文件進行寫入。如果給定文件存在,則其內容將被銷毀
"a"在新數(shù)據(jù)寫入文件之前,在文件末尾打開以寫入(追加),而不刪除文件結束 (EOF) 標記。如果文件不存在,則創(chuàng)建該文件
"r+"可打開讀取和寫入。該文件必須存在
"w+"打開一個空文件進行讀取和寫入。如果該文件存在,則其內容將被銷毀
"a+" 打開以供閱讀和追加。追加操作包括在將新數(shù)據(jù)寫入文件之前刪除 EOF 標記。寫入完成后,不會還原 EOF 標記。如果文件不存在,則創(chuàng)建該文件

除了上述模式外,還可以包含以下字符,以指定換行符的轉換模式: 

模式修改器翻譯模式
t以文本(翻譯)模式打開。
b以二進制(未翻譯)模式打開;禁止顯示涉及回車符和換行符的轉換。

返回值 

如果成功,則為零;失敗時的錯誤代碼

使用Close函數(shù)文件關閉。

文件寫入

size_t fwrite(
   const void *buffer,
   size_t size,
   size_t count,
   FILE *stream
);

參數(shù)buffer

表示存儲讀取數(shù)據(jù)的緩沖區(qū)

參數(shù)size

表示要寫入數(shù)據(jù)的一個字符的大?。ㄒ宰止?jié)為單位)

參數(shù)count

表示要寫入數(shù)據(jù)的字符數(shù)

參數(shù)stream

表示指向文件結構體的指針 

返回值

fwrite返回函數(shù)寫入的完整項數(shù),如果發(fā)生錯誤,該數(shù)可能小于count。

文件讀取

size_t fread(
   void *buffer,
   size_t size,
   size_t count,
   FILE *stream
);

參數(shù)buffer

表示存儲讀取數(shù)據(jù)的緩沖區(qū)

參數(shù)size

表示要讀取數(shù)據(jù)的一個字符的大小(以字節(jié)為單位)

參數(shù)count

表示要讀取數(shù)據(jù)的字符數(shù)

參數(shù)stream

表示指向文件結構體的指針 

返回值

fread返回函數(shù)讀取的完整項目數(shù),如果發(fā)生錯誤,或者在達到COUNT 之前遇到文件末尾,則可能小于Count。

fseek函數(shù)

可以通過fseek函數(shù)設置文件指針的位置。通過該方法可以計算出文件的大小

int fseek(
   FILE *stream,
   long offset,
   int origin
);

參數(shù)stream

表示指向文件結構體的指針

參數(shù)offset

表示指針的偏移量

參數(shù)origin

表示指針所處位置 ,其可以設置的如下的取值

取值意義
SEEK_CUR文件指針的當前位置
SEEK_END文件結束
SEEK_SET文件的開頭

ftell函數(shù) 

ftell函數(shù)可以獲取文件指針的當前位置。通過fseek結合ftell兩個函數(shù)可以計算出文件的大小

long ftell(
   FILE *stream
);

Demo示例

寫數(shù)據(jù):

void CMyFileCFileView::OnFileWrite() {
    FILE* pFile = NULL;
    //打開文件
    errno_t err = _wfopen_s(&pFile, _T("1.txt"), _T("w"));
    if (err != 0) {
        TRACE("Open File failed errorcode :%d", GetLastError());
        return;
    }
    fwrite(L"Hello World", 2, wcslen(L"Hello World")+1, pFile);
    fclose(pFile);
}

讀數(shù)據(jù): 

void CMyFileCFileView::OnFileRead() {
    FILE* pFile = NULL;
    errno_t err = _wfopen_s(&pFile, _T("1.txt"), _T("r"));
    if (err != 0) {
        TRACE("Open File failed errorcode :%d", GetLastError());
        return;
    }
    fseek(pFile, 0, SEEK_END);//文件指針定位,偏移到結尾
    int len = ftell(pFile);//得到文件指針的當前位置 = 每個字符大小×字符長度
    WCHAR* pBuf = new WCHAR[len];
    fseek(pFile, 0, SEEK_SET);//文件指針回到文件起始位置
    pBuf[len] = 0;
    fread(pBuf, 2, len, pFile);
    MessageBox(pBuf);
    fclose(pFile);
}

解決讀取亂碼 

使用C語言進行文件操作時如果稍微不注意很容易讀出亂碼。一般出現(xiàn)這種亂碼有兩種原因,一種時寫入的數(shù)據(jù)沒有寫入結束符,另一種是讀取數(shù)據(jù)時,讀取數(shù)據(jù)的個數(shù)設置出錯。

例如下面這種寫入數(shù)據(jù)和讀取數(shù)據(jù)的代碼,運行出來就會出現(xiàn)亂碼。

//寫數(shù)據(jù)
fwrite(L"Hello World", 2, wcslen(L"Hello World"), pFile);
 
//讀數(shù)據(jù)
//pFile此時移動到了文件末尾
int len = ftell(pFile);//得到文件指針的當前位置 = 每個字符大小×字符長度
WCHAR* pBuf = new WCHAR[len];
fseek(pFile, 0, SEEK_SET);//文件指針回到文件起始位置
fread(pBuf, 2, len, pFile);

使用ftell獲取的文件指針到的位置為 一個字符大小 ×字符長度。 雖然"Hello World"有11個字符,但是WCHAR類型,所以ftell返回的值為22。在之后使用fread讀取數(shù)據(jù)時讀到了len×2=44字節(jié)的內容,而寫入的數(shù)據(jù)才22字節(jié),因此會出現(xiàn)亂碼。

解決方法:

方法一:給存儲的數(shù)據(jù)結尾加上結束符'\0"

在寫數(shù)據(jù)時:

fwrite(L"Hello World", 2, wcslen(L"Hello World")+1, pFile);

寫入的實際長度+1,這樣寫入的數(shù)據(jù)后面會增加一個'\0'結束符。

fread在達到COUNT 之前遇到文件末尾也會停止。這樣在緩沖緩沖數(shù)組就可以讀到實際數(shù)據(jù)和一個結束符。打印時就能正常打印出。

//寫數(shù)據(jù)
fwrite(L"Hello World", 2, wcslen(L"Hello World")+1, pFile);
 
//讀數(shù)據(jù)
//pFile此時移動到了文件末尾
int len = ftell(pFile);//得到文件指針的當前位置 = 每個字符大小×字符長度
WCHAR* pBuf = new WCHAR[len];
fseek(pFile, 0, SEEK_SET);//文件指針回到文件起始位置
fread(pBuf, 2, len, pFile);

方法二:限制讀取的大小

因為len得到的是一個字符的大小×字符數(shù),如果把len/sizeof(WCHAR),就可以獲得實際的字符數(shù)。在讀取數(shù)據(jù)時使用這個實際的長度作為讀取數(shù),之后將緩沖數(shù)組len的位置賦值為'\0'。就可以讀取到實際數(shù)據(jù)

//寫數(shù)據(jù)
fwrite(L"Hello World", 2, wcslen(L"Hello World"), pFile);
 
//讀數(shù)據(jù)
//pFile此時移動到了文件末尾
int len = ftell(pFile);//得到文件指針的當前位置 = 每個字符大小×字符長度
WCHAR* pBuf = new WCHAR[len];
fseek(pFile, 0, SEEK_SET);//文件指針回到文件起始位置
fread(pBuf, 2, len/2, pFile);
pBuf[len/2] = 0;

到此這篇關于C語言中文件常見操作的示例詳解的文章就介紹到這了,更多相關C語言文件操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談C++/C關于#define的那些奇奇怪怪的用法

    淺談C++/C關于#define的那些奇奇怪怪的用法

    本文主要介紹了C++/C關于#define的那些奇奇怪怪的用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Visual Studio調試C/C++教程指南

    Visual Studio調試C/C++教程指南

    VisualStudio是微軟開發(fā)的一款集成開發(fā)環(huán)境軟件,本文主要介紹了Visual Studio調試C/C++教程指南,熟悉地掌握基于VS的C/C++調試技術,可以大幅提升調試性能,感興趣的可以了解一下
    2024-06-06
  • 詳解進程同步與互斥機制

    詳解進程同步與互斥機制

    進程同步是一個操作系統(tǒng)級別的概念,是在多道程序的環(huán)境下,存在著不同的制約關系,為了協(xié)調這種互相制約的關系,實現(xiàn)資源共享和進程協(xié)作,從而避免進程之間的沖突,引入了進程同步
    2021-06-06
  • Qt讀取和寫入配置(ini)文件

    Qt讀取和寫入配置(ini)文件

    ini文件在windows系統(tǒng)中可以存儲需要持久保存的配置信息,本文主要介紹了Qt讀取和寫入配置(ini)文件,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C/C++雜記 虛函數(shù)的實現(xiàn)的基本原理(圖文)

    C/C++雜記 虛函數(shù)的實現(xiàn)的基本原理(圖文)

    這篇文章主要介紹了C/C++雜記 虛函數(shù)的實現(xiàn)的基本原理(圖文),需要的朋友可以參考下
    2016-06-06
  • 基于OpenCV實現(xiàn)的人臉簽到系統(tǒng)源代碼

    基于OpenCV實現(xiàn)的人臉簽到系統(tǒng)源代碼

    本文從實際背景和需求出發(fā),采用人臉識別簽到考勤改變了傳統(tǒng)人工檢驗的做法,極大提高了組織效率和辦事能力,這篇文章主要給大家介紹了關于如何基于OpenCV實現(xiàn)的人臉簽到系統(tǒng)的相關資料,需要的朋友可以參考下
    2024-04-04
  • C 標準I/O庫的粗略實現(xiàn)教程

    C 標準I/O庫的粗略實現(xiàn)教程

    下面小編就為大家分享一篇C 標準I/O庫的粗略實現(xiàn)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 下標操作符重載模擬多維數(shù)組詳解

    下標操作符重載模擬多維數(shù)組詳解

    雖然不能直接實現(xiàn)一對下標操作符重載,但是我們可以間接模擬。思路是這樣的,先通過單下標操作返回一個具有下標操作能力的左值,對左值進行下標操作,兩個下標操作表達式聯(lián)立就實現(xiàn)了雙下標操作
    2013-09-09
  • Qt實現(xiàn)定時器的兩種方法分享

    Qt實現(xiàn)定時器的兩種方法分享

    這篇文章主要為大家詳細介紹了Qt中實現(xiàn)定時器的兩種不同方法,文中的示例代碼講解詳細,對我們了解Qt有一定的幫助,感興趣的可以跟隨小編一起學習一下
    2022-11-11
  • C語言實現(xiàn)txt數(shù)據(jù)讀入內存/CPU緩存實例詳解

    C語言實現(xiàn)txt數(shù)據(jù)讀入內存/CPU緩存實例詳解

    這篇文章主要介紹了C語言實現(xiàn)txt數(shù)據(jù)讀入內存/CPU緩存實例詳解的相關資料,這里對實現(xiàn)該函數(shù)進行了代碼實現(xiàn),需要的朋友可以參考下
    2017-01-01

最新評論