user-0 提问: 求知：C语言程序能处理非txt格式的文件吗？

回复:
user: user-1
content: 仅供参考#pragma comment(lib,"gdi32") #include <windows.h> #include <stdio.h>  int main() {     const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;      PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);     pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);     pbmi->bmiHeader.biWidth = uWidth;     pbmi->bmiHeader.biHeight = uHeight;     pbmi->bmiHeader.biPlanes = 1;     pbmi->bmiHeader.biBitCount = 1;     pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;     pbmi->bmiColors[0].rgbBlue = 0;     pbmi->bmiColors[0].rgbGreen = 0;     pbmi->bmiColors[0].rgbRed = 0;     pbmi->bmiColors[1].rgbBlue = 255;     pbmi->bmiColors[1].rgbGreen = 255;     pbmi->bmiColors[1].rgbRed = 255;      HDC hDC = CreateCompatibleDC (0);     void * pvBits;     HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);     SelectObject (hDC, hBitmap);     HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体"); //  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");     SelectObject (hDC, hFont);     BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);      char c[4];     int i, j;     for (i = 128; i < 256; i++) {         sprintf (c, "%02X", i);         TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);     }     for (j = 0; j < 256; j++) {         sprintf (c, "%02X", j);         TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);     }     for (i = 128; i < 256; i++) {         for (j = 0; j < 256; j++) {             c[0] = (char) i;             c[1] = (char) j;             TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);         }     }     for (i = 0; i < 130; i++) {         MoveToEx (hDC, 0, i * 17, NULL);         LineTo (hDC, uWidth, i * 17);     }     for (j = 0; j < 258; j++) {         MoveToEx (hDC, j * 17, 0, NULL);         LineTo (hDC, j * 17, uHeight);     }      BITMAPFILEHEADER bmfh;     bmfh.bfType = *(PWORD) "BM";     bmfh.bfReserved1 = 0;     bmfh.bfReserved2 = 0;     bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;     bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;      HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);     if (hFile != INVALID_HANDLE_VALUE) {         DWORD dwWritten;         WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);         WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);         WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);          CloseHandle (hFile);     }      DeleteObject (hFont);     DeleteObject (hBitmap);     DeleteDC (hDC);     LocalFree (pbmi);      return 0; }

user: user-2
content: 引用 楼主 mcmay 的回复:各位达人，请问C语言做的程序除了处理txt文件之外，还能处理其他常见文件格式吗？例如，doc, xls, pdf, bmp,jpg等等。我看到的所有C语言处理文件的例子中，几乎全是处理txt格式，而且还是ANSI字符集的。虽然也有二进制读写的，但却没有谈如何处理特殊格式的文档，只是说特殊格式的文档中那些格式或特征性的东西也都是由二进制数据控制的，至于这些格式和特征如何在C语言的程序中进行读或写却没有涉及。      我想C语言应该有办法处理这些特殊格式的文档，否则如果只是跟txt打交道，那它的有用性在这方面还是要打折扣的。C语言诞生于Unix系统，该系统上的文档最初也都是ANSI字符集之内的，但现在的操作系统应该能够处理不同格式的文件，C语言在这方面应该也会有所更新吧。 所有的文件保存到硬盘都是2进制，从理论上说，C语言是无所不能的，你想打开什么文件，就要知道这个文件的协议即可，按照这种文件的协议去解析里面的内容。

user: user-1
content: 哦？！原来我一直是横着走的？

user: user-3
content: 引用 9 楼 zhao4zhong1 的回复:电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 我发现这个可以在C/C++版可以横行天下。

user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-4
content: 摘抄   A file, in the computer world, is a self contained piece of information available to the operating system and any number of individual programs. Information inside the file could consist of essentially anything but whatever the file contains is likely related somehow. A computer file can be thought of much like a traditional file that one would find in an office's file cabinet.  Whatever program uses an individual file is responsible for understanding its contents. Similar types of files are said to be of a common "format." In most cases, the easiest way to determine a file's format is to look at the file's extension.  Each individual file in Windows will also have a file attribute which sets a condition to the specific file.  Files in any operating system are stored on hard drives, optical drives, and other storage devices. The specific way a file is stored and organized is referred to as a file system.  Examples: "For years I had a text file that I stored important telephones and addresses in. A few years ago, when I first started using Microsoft Excel, I moved the information that text file to a new Excel file I created. In this new file format, I can sort names and display the information in new ways."

user: user-5
content: 引用 楼主 mcmay 的回复:C语言诞生于Unix系统，该系统上的文档最初也都是ANSI字符集之内的，但现在的操作系统应该能够处理不同格式的文件，C语言在这方面应该也会有所更新吧。  C语言指指提供基本读写操作，用C语言编写的程序/库可以完成更复杂的IO。

user: user-6
content: 就算你只用标准库，也应当知道fread、fwrite是读写字节的啊。

user: user-7
content: 所有格式文件的读和写都没有任何区别，之所以c语言大多数例子都是处理txt文件，那是因为它没有内部格式可以集中关心要学的东西，否则直接拿个tiff格式的图片写例程——新手同学们光是看格式定义就要头晕三天

user: user-8
content: 引用 3 楼 czarten 的回复:举个例子你说doc，doc无非是word自己定义的格式而已，而word跟你自己写的应用程序没有本质的不同，你也可以自己做一个字处理软件，定义一种自己的格式，显然C语言不可能为每种格式的文件都提供标准库函数来操作它，它只需要提供基本的字节操作就行了，而你需要知道doc的数据格式是如何组织的，文件里每个字节代表什么，然后就可以用基本的字节操作来完成你想要的功能了 当然，也可以找第三方的函数库，但总之这不是C语言管的事  另外我觉得你有些误解，你可能觉得文件的后缀名是一个很重要的东西，其实后缀名只是提示操作系统，哪个程序能打开我而已，一个文件仅仅是一堆字节，跟它后缀名叫什么没关系，这堆字节代表什么意义，取决于谁来解读它，你用图片软件打开它，这堆字节就按照图片格式解析，你用word打开它，这堆字节就按照doc格式解析（这么说不太严格但意思差不多）+1

user: user-9
content: 其实所有的文件都是二进制文件，因为文本文件比较方便，用途很多，所以把它单独抽出来。doc/xls/pdf/bmp/jpg格式的解析，完全取决于你对其文件格式的理解，在C语言中，都可以通过fopen/fclose/fread/fwrite/fgetc/fputc/fseek这些API来实现。  引用 楼主 mcmay 的回复:各位达人，请问C语言做的程序除了处理txt文件之外，还能处理其他常见文件格式吗？例如，doc, xls, pdf, bmp,jpg等等。我看到的所有C语言处理文件的例子中，几乎全是处理txt格式，而且还是ANSI字符集的。虽然也有二进制读写的，但却没有谈如何处理特殊格式的文档，只是说特殊格式的文档中那些格式或特征性的东西也都是由二进制数据控制的，至于这些格式和特征如何在C语言的程序中进行读或写却没有涉及。      我想C语言应该有办法处理这些特殊格式的文档，否则如果只是跟txt打交道，那它的有用性在这方面还是要打折扣的。C语言诞生于Unix系统，该系统上的文档最初也都是ANSI字符集之内的，但现在的操作系统应该能够处理不同格式的文件，C语言在这方面应该也会有所更新吧。

user: user-10
content: 举个例子你说doc，doc无非是word自己定义的格式而已，而word跟你自己写的应用程序没有本质的不同，你也可以自己做一个字处理软件，定义一种自己的格式，显然C语言不可能为每种格式的文件都提供标准库函数来操作它，它只需要提供基本的字节操作就行了，而你需要知道doc的数据格式是如何组织的，文件里每个字节代表什么，然后就可以用基本的字节操作来完成你想要的功能了 当然，也可以找第三方的函数库，但总之这不是C语言管的事  另外我觉得你有些误解，你可能觉得文件的后缀名是一个很重要的东西，其实后缀名只是提示操作系统，哪个程序能打开我而已，一个文件仅仅是一堆字节，跟它后缀名叫什么没关系，这堆字节代表什么意义，取决于谁来解读它，你用图片软件打开它，这堆字节就按照图片格式解析，你用word打开它，这堆字节就按照doc格式解析（这么说不太严格但意思差不多）

user: user-11
content: txt格式是什么格式？

user: user-10
content: 所有文件都是二进制啊 至于要操作具体的类型，比如说bmp，你需要知道bmp的数据格式，比如开头多少字节是文件头，接下来每个像素信息占几位，每几位代表什么意思，这些都是可以查到的，而C语言只需要提供底层的字节操作就行了，具体的文件类型操作不是C语言的事情是程序员的事情 那些文件格式无非也都是应用程序自己定义的而已

user: user-12
content: 能，LZ想想，Word使用什么语言写的？

user: user-13
content: 如果你想要处理unicode字符的话C是完全可以的，只是函数稍微变以下，比如fwprintf函数等等。基本输入输出函数都有宽位字符的版本。你可以查看下stdio.h里面的函数声明，带w的基本都是宽位字符版本的。windows也为此专门提供了转码的api。 对于文件的处理，其实都是一样的，问题在于如何解析文件的内容。比如你认为C无法读取doc文件只是因为你无法正确的解析读取出来的文件而已。 C读取doc、xls文件可能不一定可以。C++倒是可以，但是需要导入几个类，所以C估计是不行的。至于其他的一些文件比如bmp,jpg等也是如此，一般会有对应的库来解决这样的问题，C++肯定都可以，C行不行就需要google之后才能断定