简单日志输出:
#include<stdio.h> #include<string.h> #include<stdlib.h> void write(char* filename,char* szStr){ FILE* fp; fp = fopen(filename,"at+"); if(fp != NULL){ fwrite(szStr,256,1,fp); // fclose(fp); fp = NULL; } } int main(int argc, char** argv){ int i; for(i = 0; i < argc; i++){ write("log.txt",argv[i]); } return 0; }
Attention:
fwrite(szStr,256,1,fp); // fwrite(szStr,strlen(szStr),1,fp);
日志会出现乱码的情况
fopen()函数:
函数声明:include<stdio.h>
函数原型:FILE *fopen(const char *filename, const char *mode);
函数参数:filename:log文件名 mode:文件访问模式
函数功能:按照给的的模式mode打开filename所指向的文件
函数返回值:文件顺利打开后,指向改流的文件指针就会被返回。如果文件打开失败,就返回NULL,并把错误代码存储在error中。
参数说明:
mode有几种形态的字符串:
r | 以只读的方式打开文件,文件必须存在 |
r+ | 以读/写的方式打开文件,文件必须存在 |
rb+ | 以读/写的方式打开一个二进制文件,只允许读写数据 |
rt+ | 以读/写方式打开一个文本文件,允许读和写 |
w | 打开只读文件,若文件存在则文件长度清零,即文件内容会消失;若文件不存在,则创建该文件 |
a | 以附加的方式打开只写文件,若文件不存在,则创建该文件,若文件存在,将写入的数据加在文件的末尾 |
a+ | 以附加的方式打开读/写文件,若文件不存在,则创建该文件,若文件存在,将写入的数据加在文件的末尾 |
wb | 以只写的方式打开或新建一个二进制文件,只允许写数据 |
wb+ | 以只写的方式打开或新建一个二进制文件,允许读和写 |
wt+ | 以读/写的方式打开一个文本文件,允许读和写 |
at+ | 以读/写方式打开一个文本文件,允许读或在文本末追加数据 |
ab+ | 以读/写的方式打开一个二进制文件,允许读或者在文件末尾追加数据 |
补充:
1.以x结尾的模式为独占模式,文件已存在或无法创建(一般为路径文件问题)导致fopen打开失败。文件以操作系统支持的独占模式打开。
2.上述的形态字符串都可以再加一个b字符,如rb/w+b/ab+等,加入b字符来告诉函数库以二进制打开文件。如果没有b,则默认加t,即以文本模式打开文件。
3.二进制和文本模式区别:
在windows系统中,文本模式下:文件以“\n\r”代表换行。若以文本模式打开文件,并用fputs等函数写入换行符“\n”时,函数会自动在“\n”前面加“\r”。即实际写入文件的时“\r\n”。
在unix/linux系统中,文本模式下“\n”代表换行,linux系统下文本和二进制模式下无区别。
总结:
- 是否是二进制打开,加b
- 读写方式:只读、只写、读写、追加只写、追加读写。
- 读文件是否必须存在,以及存在时是清空还是追加不同的响应。
fwrite()函数:
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
函数参数:
ptr: 指向要被写入的元素数组的指针。
size: 要被写入的每个元素的大小,单位字节
nmemb: 元素的个数,每个元素大小为size字节
stream: 这是指向FILE对象的指针,该FILE对象指定了一个输出流。
函数功能:把ptr所指向的数组中的数据写入到指定的stream中。
返回值: 如果成功,返回一个size_t的对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与nmemb参数不同,则会出现一个错误。