`

C++读取文本文件 .

    博客分类:
  • c++
阅读更多
转:   http://blog.csdn.net/lightlater/article/details/6326338

写在开始

最近在做一个东东,遇到文件读取的问题,遂开始研究,使用C++读取文本文件比较简单,也是一个很好的切入点,所以进行了一些小实验。



这里仅仅举例,使用ANSI,UNICODE,UTF-8三种常用的文本文件作为示例。





关于文本文件的文件头

第一 ANSI文件的文件头为空,不需要处理;

第二 UNICODE文件的文件头为0xFF,0xFE共计两个字节,读取时需要偏移两个字节再行读取;

第三 UTF-8文件的文件头为0xEF,0xBB,0xBF共计三个字节,读取时需要偏移三个字节后再行读取;





关于文本文件类型的判断

根据文本文件的文件头,就可以判断文本文件的类型了。

假设有如下文件类型定义:

typedef enum FileType

{

    ANSI = 0,

    UNICODE,

    UTF8,

}FILETYPE;



我们就可以根据上述特性,来判断文本文件的类型了,下面是一段示例代码:

FILETYPE GetTextFileType(const std::string & strFileName)

{

    FILETYPE fileType = ANSI;

    std::ifstream file;

    file.open(strFileName.c_str(), std::ios_base::in);



    bool bUnicodeFile = false;

    if (file.good())

    {

        char szFlag[3] = {0};

        file.read(szFlag, sizeof(char) * 3);

        if ((unsigned char)szFlag[0] == 0xFF

        && (unsigned char)szFlag[1] == 0xFE)

        {

                fileType = UNICODE;

        }

        else if ((unsigned char)szFlag[0] == 0xEF

        && (unsigned char)szFlag[1] == 0xBB

        && (unsigned char)szFlag[2] == 0xBF)

        {

            fileType = UTF8;

        }

    }



    file.close();



    return fileType;

}





ANSI文本文件的读取

ANSI文本文件不需要进行文件头的处理,可以直接读取。

下面是简单示例:

char szBuf[FBLOCK_MAX_BYTES];

memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES);



std::string strMessage;



FILE * fp = NULL;

fp = fopen(strFileName.c_str(), "rb");

if (fp != NULL)

{

    // common file do not offset.

    while(fread(szBuf, sizeof(char), FBLOCK_MAX_BYTES, fp) > 0)

    {

        strMessage += szBuf;

        memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES);

    }

}



std::cout << strMessage << std::endl;



fclose(fp);





UNICODE文本文件读取

由于UNICODE普遍采用双字节来表示字符,因此读取时,当使用wchar_t类型来读取,使用fopen,fread来进行操作。

下面是简单示例:

wchar_t szBuf[FBLOCK_MAX_BYTES];

memset(szBuf, 0, sizeof(wchar_t) * FBLOCK_MAX_BYTES);



std::string strMessage;



FILE * fp = NULL;

fp = fopen(strFileName.c_str(), "rb");

if (fp != NULL)

{

    // Unicode file should offset wchar_t bits(2 byte) from start.

    fseek(fp, sizeof(wchar_t), 0);

    while(fread(szBuf, sizeof(wchar_t), FBLOCK_MAX_BYTES, fp) > 0)

    {

        char szTemp[FBLOCK_MAX_BYTES] = {0};



        UnicodeToANSI(szTemp, szBuf);

        strMessage += szTemp;

        memset(szBuf, 0, sizeof(wchar_t) * FBLOCK_MAX_BYTES);

    }

}



std::cout << strMessage << std::endl;



fclose(fp);





UTF8文本文件的读取

UTF8是可变字节,使用单一字节读取比较合理,所以读取时,使用char作为基本类型。

下面是简单示例代码:

char szBuf[FBLOCK_MAX_BYTES];

memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES);



std::string strMessage;



FILE * fp = NULL;

fp = fopen(strFileName.c_str(), "rb");

if (fp != NULL)

{

    // UTF-8 file should offset 3 byte from start position.

    fseek(fp, sizeof(char) * 3, 0);

    while(fread(szBuf, sizeof(char), FBLOCK_MAX_BYTES, fp) > 0)

    {

        strMessage += szBuf;

        memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES);

    }

}



std::cout << strMessage << std::endl;



fclose(fp);







后记

文本文件的读取并非一个大的问题,但是使用的较多,而各个开发部门一般使用成熟的库,开发人员很少可以接触到低层的东东。

当无力支持购买成熟库的时候,就需要自己来做些东西了,这里仅仅是一个开始。



附录:测试源代码

view plaincopy to clipboardprint?
01.#include <assert.h>  
02.#include <windows.h>  
03.#include <iostream>  
04.#include <fstream>  
05.#include <string>  
06. 
07.const int FBLOCK_MAX_BYTES = 256; 
08. 
09.// File Type.  
10.typedef enum FileType 
11.{ 
12.    ANSI = 0, 
13.    UNICODE, 
14.    UTF8, 
15.}FILETYPE; 
16. 
17.FILETYPE GetTextFileType(const std::string & strFileName); 
18. 
19.int UnicodeToANSI(char * pDes, const wchar_t * pSrc); 
20. 
21.void main() 
22.{ 
23.    // file test.  
24.    std::string strFileANSI = "C://Hello_ANSI.txt"; 
25.    std::string strFileUNICODE = "C://Hello_UNICODE.txt"; 
26.    std::string strFileUTF8 = "C://Hello_UTF8.txt"; 
27. 
28.    // please change the file name to test.  
29.    std::string strFileName = strFileUTF8; 
30. 
31.    FILETYPE fileType = GetTextFileType(strFileName); 
32. 
33.    if (UNICODE == fileType) 
34.    { 
35.        wchar_t szBuf[FBLOCK_MAX_BYTES]; 
36.        memset(szBuf, 0, sizeof(wchar_t) * FBLOCK_MAX_BYTES); 
37. 
38.        std::string strMessage; 
39. 
40.        FILE * fp = NULL; 
41.        fp = fopen(strFileName.c_str(), "rb"); 
42.        if (fp != NULL) 
43.        { 
44.            // Unicode file should offset wchar_t bits(2 byte) from start.  
45.            fseek(fp, sizeof(wchar_t), 0); 
46.            while(fread(szBuf, sizeof(wchar_t), FBLOCK_MAX_BYTES, fp) > 0) 
47.            { 
48.                char szTemp[FBLOCK_MAX_BYTES] = {0}; 
49. 
50.                UnicodeToANSI(szTemp, szBuf); 
51.                strMessage += szTemp; 
52.                memset(szBuf, 0, sizeof(wchar_t) * FBLOCK_MAX_BYTES); 
53.            } 
54.        } 
55. 
56.        std::cout << strMessage << std::endl; 
57. 
58.        fclose(fp); 
59.    } 
60.    else if (UTF8 == fileType) 
61.    { 
62.        char szBuf[FBLOCK_MAX_BYTES]; 
63.        memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES); 
64.         
65.        std::string strMessage; 
66.         
67.        FILE * fp = NULL; 
68.        fp = fopen(strFileName.c_str(), "rb"); 
69.        if (fp != NULL) 
70.        { 
71.            // UTF-8 file should offset 3 byte from start position.  
72.            fseek(fp, sizeof(char) * 3, 0); 
73.            while(fread(szBuf, sizeof(char), FBLOCK_MAX_BYTES, fp) > 0) 
74.            { 
75.                strMessage += szBuf; 
76.                memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES); 
77.            } 
78.        } 
79.         
80.        std::cout << strMessage << std::endl; 
81.         
82.        fclose(fp); 
83.    } 
84.    else 
85.    { 
86.        char szBuf[FBLOCK_MAX_BYTES]; 
87.        memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES); 
88.         
89.        std::string strMessage; 
90.         
91.        FILE * fp = NULL; 
92.        fp = fopen(strFileName.c_str(), "rb"); 
93.        if (fp != NULL) 
94.        { 
95.            // common file do not offset.  
96.            while(fread(szBuf, sizeof(char), FBLOCK_MAX_BYTES, fp) > 0) 
97.            { 
98.                strMessage += szBuf; 
99.                memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES); 
100.            } 
101.        } 
102. 
103.        std::cout << strMessage << std::endl; 
104.         
105.        fclose(fp); 
106.    } 
107. 
108.#ifdef _DEBUG  
109.    getchar(); 
110.#endif  
111.} 
112. 
113.FILETYPE GetTextFileType(const std::string & strFileName) 
114.{ 
115.    FILETYPE fileType = ANSI; 
116.    std::ifstream file; 
117.    file.open(strFileName.c_str(), std::ios_base::in); 
118.     
119.    bool bUnicodeFile = false; 
120.    if (file.good()) 
121.    { 
122.        char szFlag[3] = {0}; 
123.        file.read(szFlag, sizeof(char) * 3); 
124.        if ((unsigned char)szFlag[0] == 0xFF  
125.            && (unsigned char)szFlag[1] == 0xFE) 
126.        { 
127.            fileType = UNICODE; 
128.        } 
129.        else if ((unsigned char)szFlag[0] == 0xEF  
130.            && (unsigned char)szFlag[1] == 0xBB  
131.            && (unsigned char)szFlag[2] == 0xBF) 
132.        { 
133.            fileType = UTF8; 
134.        } 
135.    } 
136. 
137.    file.close(); 
138. 
139.    return fileType; 
140.} 
141. 
142.int UnicodeToANSI(char * pDes, const wchar_t * pSrc) 
143.{ 
144.    assert(pDes != NULL); 
145.    assert(pSrc != NULL); 
146. 
147.    int nLen = ::WideCharToMultiByte(CP_ACP, 0, pSrc, -1, NULL, 0, NULL, NULL); 
148.    if (nLen == 0)  
149.    { 
150.        return -1; 
151.    } 
152. 
153.    return ::WideCharToMultiByte(CP_ACP, 0, pSrc, -1, pDes, nLen, NULL, NULL); 
分享到:
评论

相关推荐

    c++读取配置文件.ini文件.rar

    `c++读取配置文件.ini文件.rar`这个压缩包包含了一些关键文件,它们展示了如何在C++中读取和操作`.ini`文件。这些文件包括: 1. **RrConfig.cpp**:这是实现配置文件读取功能的主要源代码文件,它包含了读取和解析`...

    c++读取Rinex几种文件(o文件,n文件,sp3文件)

    总的来说,C++读取RINEX文件涉及到了文件操作、数据解析、格式理解等多个方面,对于提升C++编程能力以及对GPS数据的理解都大有裨益。熟悉这些操作,不仅能够加深对RINEX标准的理解,还能为处理其他类似格式的科学...

    c++文件读写.pdf

    读写文件分为文本文件和二进制文件的读取。 1、文本文件的读写 文本文件的读写很简单:用插入器 () 向文件输出;用析取器 (&gt;&gt;) 从文件输入。 例如: file2 ; // 向文件写入字符串"I Love You" int I; file1 &gt;...

    AddLineNum.rar_C++读取文本_文本文件 读取_读取文本文件

    这个程序可以作为C++读取文本文件并添加行号的基本模板。你可以根据需要修改文件名和输出格式。通过理解这个过程,你不仅可以实现题目中的需求,还能掌握处理文件的基础技巧,这对于任何C++开发者来说都是至关重要的...

    C++读取通达信shm.tnf文件股票代码/名称

    本话题主要聚焦于如何使用C++编程语言读取通达信特有的shm.tnf文件,从中提取股票代码和名称以及其缩写信息。 shm.tnf文件是通达信用来存储股票数据的一种二进制格式,通常包含了股票的基本信息,如股票代码、名称...

    C++读取XML文件内容

    本程序是用C++来读取一个XML文档中的内容,其中包括两方面的内容:一,创建一个XML文档;二,读取指定XML文档中的内容,非常适合于初学XML的人的一个C++源代码

    C++读取WAV格式音频文件

    在C++中,可以自定义结构体来存储fmt块和data块的数据,然后使用`ifstream`的`read`函数来读取文件内容。注意,由于WAV文件可能有额外的扩展信息或非标准格式,所以在读取时需要进行适当的错误处理。 在实际项目中...

    C++读取html内容

    在给定的标题"C++读取html内容"中,我们可以理解这是一个关于如何使用C++来获取并处理HTML文档的课题。这个过程可以分为几个关键步骤,我们将详细探讨这些步骤以及可能涉及的技术。 首先,要从互联网上读取HTML内容...

    C++_C++_读取txt文档_txt内容读取_按空格分隔_按逗号分隔_

    2. **读取txt内容**:接着,我们可以使用getline()函数逐行读取文件内容。getline()接受两个参数,一个是输入流,另一个是用于存储行内容的字符串变量,还可以选择一个字符作为分隔符(默认为'\n')。 ```cpp std:...

    C++-读取txt.pdf

    C++读取txt文件方法 C++是一种功能强大且流行的编程语言,在许多领域都有广泛的应用。其中,文件输入/输出是C++编程中非常重要的一方面。今天,我们将讨论如何使用C++读取txt文件。 在C++中,读取txt文件可以使用...

    C++读写ini配置文件

    在C++编程中,处理配置文件通常是为了存储和读取应用程序的设置或用户偏好。ini文件是一种常见的配置文件格式,其结构简单,易于理解和操作。本文将深入探讨如何使用C++来读写ini配置文件,主要参考提供的"rwconfig....

    C++直接读取Excel文件数据.rar_C++ xls 文件_C++ 读取xls_c++excel_c++解析excel_c+

    总的来说,C++读取Excel文件涉及到的知识点包括:第三方库的选择与使用、文件I/O操作、可能的XML解析等。在实际项目中,应根据具体需求选择最适合的库,并确保遵循库的使用规范,以保证程序的稳定性和效率。

    C++读取一文本文件并进行单词统计结果

    在C++编程中,读取文本文件并进行单词统计是一项常见的任务,这涉及到文件I/O操作、字符串处理以及数据结构的运用。以下是一份详细的知识点解析: 1. **文件I/O操作**:C++标准库提供了`fstream`库来进行文件的读写...

    C++读取文本文件数据

    在C++编程环境中,读取文本文件数据是一项基础但至关重要的任务。特别是在OpenSceneGraph (OSG)这样的图形库中,我们可能需要处理保存在文本文件中的数据来构建3D场景或者配置信息。下面我们将详细探讨如何在C++中...

    C++读取TXT文件识别特定内容修改

    由于近期需要将一份Word文档转到Markdown格式,但是文件内容较大,自动转换工具转换不能完全满足我的要求,存在问题如下:导出的图片名乱码,一部分换行存在问题。 针对图片名乱码的问题,由于word中的图片拥有一定...

    C文本文件读取

    "C文本文件读取" C语言中的文本文件读取是指从文本文件中读取数据的过程,这个过程是...通过本文,我们可以看到C语言和C++语言中读取文本文件的基本步骤和实现方法,并且了解到C++语言对字符串的处理确实要强大一些。

    c++读取cfg或txt文件

    c++读取cfg或txt文档中内容并由自定义变量接收

    C++ 读取autocad DXF文件

    本主题聚焦于使用C++读取AutoCAD的DXF(Drawing Exchange Format)文件,这是一种ASCII或二进制格式,用于在不同的CAD软件之间交换数据。DXF文件包含了描述二维几何形状、图层、颜色、线型等信息。 读取DXF文件首先...

    STL文件的读取显示.zip_STL c++_STL文件_STL读取_读取stl_读取stl文件

    ASCII格式的STL文件内容可读性较强,但文件大小较大;二进制格式则更紧凑,读写速度更快。每个STL文件包含一个头信息和一系列的三角形面片描述。头信息通常为“solid”开头,然后是一些描述性的文字,接着是三角形...

    C++读取文件源码

    以上就是关于C++读取不同格式文件的基本方法。对于更复杂的情况,比如处理二进制文件、解析特定格式的数据,或者需要高效处理大量文件时,可能还需要使用到其他高级技术,例如内存映射文件(`&lt;sys/mman.h&gt;`)、多...

Global site tag (gtag.js) - Google Analytics