标准 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:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法;