2.流的概念
可以看到流其实是一个极其抽象的概念,我们可以把它理解成C程序与外部设备进行交流的一个媒介;
3.字符的读与写 fgetc 与 fputc
字符的读取函数 fgetc :
1.参数 FILE *stream :这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流;
2.返回值:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
字符的写入函数 fputc :
1.描述 :把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动;
2.参数 int char :这是要被写入的字符。该字符以其ASCII 值进行传递;
3.参数 FILE *stream : 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流;
4.返回值:该函数以无符号 char 强制转换为 int 的形式(即字符的ASCII值)返回写入的字符,如果发生错误则返回 EOF。
实例:
1. int main() 2. { 3. FILE* pf = fopen("test.txt", "w"); //以只写的方式打开文件 4. if (pf == NULL) 5. { 6. perror("fopen"); 7. return 0; 8. } 9. char ch = 0; 10. for (ch = 'a'; ch <= 'z'; ch++) //向文件写入26个小写英文字母 11. { 12. fputc(ch, pf); 13. } 14. fclose(pf); 15. pf = NULL; 16. FILE *pfread = fopen("test.txt", "r"); //以只读的方式打开文件 17. if (pfread == NULL) 18. { 19. perror("fopen"); 20. return 0; 21. } 22. while (ch!= EOF) //判断是否读取到文件末尾 23. { 24. ch = fgetc(pfread); //从文件中读取字符 25. printf("%c", ch); //打印读取道德字符 26. } 27. fclose(pfread); 28. pfread = NULL; 29. return 0; 30. }
打印结果:
4.文本行的读与写 fgets 与 fputs
文本行的读取 fgets :
1.描述: 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。
当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定;
2.参数 char *str :这是指向一个字符数组的指针,该数组存储了要读取的字符串;
3.参数 int n : 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度;
4.参数 FILE *stream :这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流;
5.返回值:如果成功,该函数返回相同的 str 参数;
如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针;
如果发生错误,返回一个空指针;
文本行的写入 fputs :
1.描述:把字符串写入到指定的流 stream 中,但不包括 '\0';
2.参数 const char *str : 这是一个数组,包含了要写入的以 '\0' 终止的字符序列;
3.参数 FILE *stream : 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流;
4.返回值:该函数返回一个非负值,如果发生错误则返回 EOF。
实例:
1. int main() 2. { 3. char str[] = "abcdefg"; 4. FILE* pf = fopen("test.txt", "w"); //以只写的方式打开文件 5. if (pf == NULL) //判断是否打开成功 6. { 7. perror("fopen"); 8. return 0; 9. } 10. fputs(str, pf); //向文件中写入 str 11. fclose(pf); 12. pf = NULL; 13. FILE* pfread = fopen("test.txt", "r"); //以只读的方式打开文件 14. if (pfread == NULL) //判断时候打开成功 15. { 16. perror("fopen"); 17. return 0; 18. } 19. char tmp[20] = { 0 }; 20. printf("%s\n", fgets(tmp, 20, pfread)); //将读取到的字符串存入 tmp 中,并打印 21. fclose(pfread); //关闭文件 22. pfread = NULL; 23. return 0; 24. 25. }
打印结果:
5.二进制的读与写 fread 与 fwrite
二进制的读取 fread :
1.描述:从给定流 stream 读取数据到 ptr 所指向的数组中;
2.参数 void *ptr :这是指向带有最小尺寸 size*nmemb 字节的内存块的指针;
3.参数 size_t size :这是要读取的每个元素的大小,以字节为单位;
4.参数 size_t nmemb :这是元素的个数,每个元素的大小为 size 字节;
5.参数 FILE *stream : 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流;
6.返回值 :成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾,即如果返回值小于元素个数 ,则发生了错误或读到文件末尾。