您的位置:首页 > 其它

c primer plus第13章总结:文件输入/输出

2016-07-15 17:16 232 查看

标准 I\O:

标准文件:

- 标准输入:getchar()、gets()、scanf();

- 标准输出:putchar()、puts()、printf();

- 标准错误输出:提供一个可发送错误消息的逻辑上不同的位置;

二进制模式打开文件时:\r\n表示换行,ctrl+Z 表示结束;

文本模式打开文件时:\n表示换行;

打开文件函数:

fopen()函数:

FILE * fp = fopen(”filename”, “mode”);

成功打开,返回文件指针,不能打开返回NULL;

在使用时,一定要对fp进行严格的判断,否则读写都会失败:

if (fp)

{



}

文件打开模式:

(1)r 打开只读文件,该文件必须存在。

(2)r+ 打开可读写的文件,该文件必须存在。

(3)w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

(4)w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

(5)a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

(6)a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

getc()、getc()函数:(需要指针参数)

ch = getc(fp); // 从指针fp的文件中获得一个字符;遇到文件结尾,getc()会返回EOF;

putc(ch, fpout);// 将字符ch写入到FILE指针fpout指定文件中;

putc(ch, stdout);等效于putch(ch);

fclose()函数:

成功关闭,返回0,否则返回EOF;

if (fclose(fp) != 0)
printf("Error in closing file %s\n", argv[1]);


标准文件指针:

标准输入、输出、错误:stdin、stdout、stderr;都是FILE型指针,可被用作标准IO的参数;

文件IO:

fprintf()、fscanf()函数:(需要参数指定合适的文件,文件参数为第一个参数)

fprintf(stdout, “……”);

fprintf(fp, “%s”, words);// 输出到文件fp中;

fscanf(fp, “%s”, words);// 将fp内内容读到words数组中;

使用fscanf()和fprint()时,注意添加rewind()指向文件初始位置;

// 从文件读取整型到数组arr
for( int i=0; fscanf(in, "%d,", arr[i]) != EOF; i++);


fgets()、fputs()函数:

fgets()函数接收三个参数,gets()和puts()只接收一个参数)

fgets(buf, MAX, fp); // buf为数组名,MAX为最大长度,fp指向要读取的文件;

读到文件结尾,添加上空字符构成字符串;若正好读完一整行后结束,fgets()会在读完的字符串和空字符之间添加换行符;gets()函数读取后将其丢弃;

fputs()函数接收两个参数,打印的时候不会添加换行符;puts()会添加;

fputs(buf, fp);// buf为字符串地址,fp指向目标文件;

随机存储:fseek()和ftell()函数

fseek()接收三个参数,返回一个int值;

ftell()接收一个参数,返回一个long型值;

实际使用时,通过ftell函数获得文件大小,然后创建需要的内存空间,快速读入需要的数据文件。

fseek(文件指针,偏移量,模式);偏移量必须是一个long型值,为正前移,为负后移;

模式:SEEK_SET 文件开始,SEEK_CUR 当前位置,SEEK_END 文件结尾;

如果一切正常,返回值为0,出现错误返回值为-1;

ftell()函数为long型,返回文件的当前位置;

size_t fwrite()函数:

将二进制数据写入文件,返回成功写入的项目数;

fwrite(buffer, 256, 1, fp);// buffer->fp;

为了防止写入出错,通常通过循环写入来保证准确性:

size_t writtenBytes = 0;
BYTE* p = buffer;
while (writtenBytes < bufferSize) // bufferSize为需要写入的缓存空间
{
size_t curWrittenBytes = fwrite(p, 256, 1, fp);
if (curWrittenBytes > 0 )
{
writtenBytes += curWrittenBytes;
p + curWrittenBytes;
}


size_t fread()函数:

将二进制数据从文件读取出来,返回成功读取的项目数;

fread(arr, sizeof(double), 10, fp );// fp->arr;

补充:

memcpy()函数:

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

void *memcpy(void *dest, const void *src, size_t n);

memset()函数:

void *memset(void *s, int ch, size_t n);

函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fprintf fscanf