C/C++文件操作,数据处理

分享到:

        在ANSI C中,对文件的操作分为两种方式,即流式文件操作I/O 文件操作,这里我们只介绍流式文件操作。(1)FILE

    进行文件操作时,必须在程序一开始就先定义文件指针:FILE *指针类型变量。FILE 在stdio.h中定义如下:
typedef struct 
{
int level;
unsigned flags;
char fd;
unsigned char hold;
int bsize;
unsigned char _FAR *buffer;
unsigned char _FAR *curp;
unsigned istemp;
short token;
} FILE;
(2)fopen
FILE *fopen(const char *filename,const char *mode);
"r"(只读)       为输入打开一个文本文件。若指定的文件不存在,则会出错。
"w"(只写)       为输出打开一个文本文件。若文件不存在,系统将用指定名建立一个新文件;若文件已经存在,则将从起始位置重新写,原有内容被更新
"rb"(只读)      为输入打开一个二进制文件。功能与"r"相同。
"wb"(只写)      为输出打开一个二进制文件。功能与"w"相同。
"a"(追加)       为追加数据打开一个文本文件。若文件不存在,系统将用指定名建立一个新文件;若文件已经存在,则新数据写在原有内容之后
"ab"(追加)      为追加数据打开一个二进制文件。其余功能与"a"相同。
"r+"(读写)     为读/写打开一个已存在文本文件。既可读,也可写,读写总是从文件的起始位置开始;更换读写操作时不必关闭文件。
"rb+"(读写)     为读/写打开一个已存在的二进制文件。功能与"r+"相同。可由位置函数设置读写的起始位置。
"w+"(读写)      为读/写建立一个新的文本文件。若文件已存在,原有内容将被更新。
"wb+"(读写)     为读/写建立一个新的二进制文件。功能与"w+"相同;可由位置函数设置读写起始位置。
"a+"(读写)      为读/写打开一个文本文件。功能与"a"相同,只是在文件尾部添加新数据后,可以从头开始读。
"ab+"(读写)     为读/写打开一个二进制文件。功能与"a+"相同,只是在文件尾部添加新数据之后,可由位置  函数设置开始读的起始位置。
         此函数返回一个FILE 指针,所以申明一个FILE 指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败,返回NULL。 

FILE *fp;
if( fp=fopen("A.TXT","r") == NULL)
{
printf("can't find this file!/n");
exit(0);
}
(3)fgetc
int fgetc(FILE *stream);
       从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。这个函数的返回值,是返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF。用法如下:
char ch1=fgetc(fp);

(4)fgets
char *fgets(char *buf, int bufsize, FILE *stream);
*buf: 字符型指针,指向用来存储所得数据的地址。
bufsize: 整型数据,指明buf指向的字符数组的大小。
*stream: 文件结构体指针,将要读取的文件流。
        从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。
例:如果一个文件的当前位置的文本如下:
Love, I Have
Since you can do it.
        如果用fgets(str1,6,file1);去读取,则执行后str1 = "Love," ,读取了6-1=5个字符,这个时候再执行fgets(str1,20,file1)则执行后str1 = " I Have\n"。而如果fgets(str1,23,file1);
则执行str1="Love ,I Have",读取了一行(包括行尾的'\n',并自动加上字符串结束符'\0'),当前文件位置移至下一行,虽然23大于当前行上字符总和,可是不会继续到下一行。而下一次调用fgets()继续读取的时候是从下一行开始读。

(5)fscanf

int fscanf(FILE *stream, char *format,[argument...]);
       FILE *stream:文件指针;char *format:格式字符串(查看其他资料,包括输入格式、忽略元素、包含元素等);[argument...]:输入列表。
       从一个流、文件(stream)中读入数据,执行格式化输入,然后将结果按照格式保存在列表中(可以理解为:将TXT文件中的内容,有针对性地提取出来,并保存在特定的列表、数组中),fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
FILE *fp = 0;
char tmp[255] = {0};
fp = fopen(argv[1],"r+");
while(EOF != fscanf(fp,"%*[^','],\"%*[^','],%[^','],%*s",tmp))
{
sscanf(tmp,"\"%s\"",tmp1);
printf("%d\n",atoi(tmp1));
}
(6)fprintf
 int fprintf(FILE *stream,char *format,[argument]);
       printf是标准输出流的输出函数,用来向屏幕这样的标准输出设备输出,而fprintf则是向文件输出,将输出的内容输出到硬盘上的文件或是相当于文件的设备上。根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件. fprintf()只能和printf()一样工作. fprintf()的返回值是输出的字符数,发生错误时返回一个负值.

char s[] = "this is a string";
char c = '\n';
stream = fopen( "fprintf.out", "w" );
fprintf( stream, "%s%c", s, c );
fprintf( stream, "%d\n", i );
fprintf( stream, "%f\n", fp );

(7)fwrite

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
       buffer:是一个指针,对fwrite来说,是要获取数据的地址;size:要写入内容的单字节数;count:要进行写入size字节的数据项的个数;stream:目标文件指针;返回实际写入的数据项个数count。向文件写入一个数据块,这个函数以二进制形式对文件进行操作,不局限于文本文件。
FILE *stream;
struct mystruct s;
if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* open file TEST.$$$ */
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
s.i = 0;
s.cha = 'A';
fwrite(&s, sizeof(s), 1, stream); /* 写的struct文件*/
(8)sscanf
int sscanf(const char *buffer,const char *format,[argument ]...);
       fscanf是从文件中读,sscanf是从字符串中读,scanf是从键盘输入中读。sscanf会从buffer(一般为字符型数组、字符串)里读进数据,依照format的格式将数据写入到argument(一般为字符型数组)里。
sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
(9)getline
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
       lineptr:指向存放该行字符的指针,如果是NULL,则有系统帮助malloc,请在使用完成后free释放。n:如果是由系统malloc的指针,请填0。stream:文件描述符。getline()函数会生成一个包含一串从输入流读入的字符的字符串,直到一下情况发生会导致生成的此字符串结束。1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。

FILE *fp;
char *line = NULL;
size_t len = 0;
ssize_t read;
if(!(fp=fopen("1.txt","r")))
{
printf("\nerror on open 1.txt file!\n");
exit(1);
}
while ((read = getline(&line, &len, fp)) != -1);

来自:http://blog.csdn.net/look595271601/article/details/16047369
昵    称:
验证码:

相关文档:

  • 内存分配模块 nedmalloc
    nedmalloc 是一个可选的malloc内存分配的实现,主要是适应多线程无锁操作,基于 dlmalloc 2.8.3 。...
  • JSONCPP介绍及使用
    JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。 jsoncpp是c++解析JSON串常用的解析库之一。其...
  • C++标准库总结
    C++标准库总结...
  • C/C++ 和 FORTRAN 的集成开发环境 Open Watcom
    Open Watcom 给C/C++ 和 FORTRAN程序员带来了一个集成的开发环境,包括了开发工具, SDK,以及库文件。可以用来开发强大的16位和32位应用程序...
  • C++常用工具类库 Rudiments
    Rudiments 是一个 C++ 类库,提供一些用来编写守护进程、客户端和服务器端的基础类,与标准C函数的封装类:还包括正则表达式、 semaphores...
  • 免费的C/C++的线程库
    免费的C/C++的线程库...
  • C++内存泄露检查的5个方法
    在Linux平台上 有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,...
  • YAML的C语言解析包 LibYAML
    LibYAML 是一个 C 语言的包,用来解析 YAML 1.1 数据。...
  • Trie树的C++实现
    Trie,又称单词查找树、前缀树,是一种哈希树的变种。应用于字符串的统计与排序,经常被搜索引擎系统用于文本词频统计。...
  • java嵌入c,c++程序指南
    本文为在 32 位 Windows 平台上实现 Java 本地方法提供了实用的 示例、步骤和准则。本文中的示例使用 Sun Microsystems 公司创建的 Java Developmen...
  • libjc - C语言事件驱动开发包
    libjc 是 C 语言的事件驱动开发框架。...
  • Windows下用Eclipse搭建C/C++开发环境
    Windows下C/C++的IDE有很多,要学习Eclipse,所以就选下面要讲的Eclipse + GNU toolchain(话说toolchain这个词很形象)....
  • Qt实现的C++框架:qtioccontainer
    QtIOCContainer 是一个用Qt实现的C++框架 控制反转概念灵感来自于Spring框架。他使用Qt的元对象系统和插件系统来实现C++的反射机制。...
  • C++系统调用库 CSCall++
    CSCall++ 是对常用的一些系统调用进行封装的 C++ 库,主要包括:线程、文件、FIFOs、串行IO、socket通讯和目录处理等。...
  • Facebook Folly源代码分析
    Folly 是 Facebook 的一个开源C++11组件库,它提供了类似 Boost 库和 STL 的功能,包括散列、字符串、向量、内存分配、位处理等,用于满足...
  • C/C++编译器 AsmJit
    C/C++编译器 AsmJit...
  • VS2013中的C++11新特性
    Visual C++ 2013 Preview 在6月发布了,C++开发者又找到一个编译器可以更好的支持ISO C++ 11 的特性了.本文介绍了这些新的特性并附有代码实例....
  • C语言编译器 Cilk
    Cilk多线程编程技术最早由MIT开 发,是一个基于Gcc编译器的开源项目。后来开发者创建了一个创业公司,推出改进的私有版本,整合到Wind...
  • 开源 C++11 组件库 Folly
    Folly 是 Facebook 的一个开源 C++11 组件库,提供了类似 Boost 和 std 库的功能。...
  • C++反射模板库 Template Reflection Library
    trl 是一个用于serialize/deserialize,object hierarchy的C++库,依赖于标准 standard C++预处理宏和模板元编程技术。...