標準IO也是帶緩存的IO钞钙,它們的操作是圍繞流進行退敦,而之前的不帶緩存IO操作是圍繞文件描述符的,標準IO還是基于文件IO或者說系統(tǒng)IO。
預讀
http://hongyilinux.blog.51cto.com/8030513/1746199
https://segmentfault.com/a/1190000008228426
http://www.yeolar.com/note/2012/05/16/linux-advanced-io/
常用函數(shù)API
FILE *fopen(const char *path, const char *mode)
int fclose(FILE *fp)
int fgetc(FILE *stream)
int fputc(int c, FILE *stream)
char *fgets(char *s, int size, FILE *stream)
int fputs(const char *s, FILE *stream)
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
程序示例:
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
fp = fopen("stdio.log", "w+");
if (fp == NULL) {
printf("File create fail...\n");
return -1;
} else {
printf("File create success...\n");
}
/* fwrite() function */
char buffer_1[] = "This is fwrite DEMO...";
size_t wr_size = 0;
wr_size = fwrite(buffer_1, 1, sizeof(buffer_1), fp);
printf("wr_size = %d\n", wr_size);
/* fputs() function */
char buffer_2[] = "\nThis is fputs DEMO...\n";
int fputs_status = 0;
fputs_status = fputs(buffer_2, fp);
printf("fputs_status = %d\n", wr_size);
/* puts function */
char buffer_3[] = "This is puts DEMO...";
puts(buffer_3);
/* fputc function */
char buffer_4[] = "This is fputc DEMO...\n";
int ret;
for (int i = 0; i < sizeof(buffer_4); i++) {
ret = fputc(buffer_4[i], fp);
printf("%c", ret);
}
/* putc function */
char buffer_5[] = "This is putc DEMO...\n";
for (int i = 0; i < sizeof(buffer_5); i++) {
ret = fputc(buffer_5[i], fp);
printf("%c", ret);
}
fclose(fp);
return 0;
}
進一步分析:
IO操作可以分為非格式IO和格式IO道偷,非格式化IO有以下三種缀旁,
- 每次讀一行IO
buf為緩沖區(qū)地址,gets表示從標準輸入讀勺鸦,而fgets從指定的流讀并巍,fgets必須指定緩沖區(qū)長度n,最后一個為null换途,能讀入n-1個字符懊渡,若一行長度大于n,則返回一個不完整的行军拟。gets沒有指定緩沖區(qū)長度會導致可能的溢出剃执,一般棄用。
fputs將一個以null字節(jié)終止的字符串寫道指定的流懈息,不一定每次一行肾档,要看有沒有換行符,和上面的讀fgets對應辫继。
puts將一個null字節(jié)終止的字符串寫到標準輸出怒见,同時會寫入一個換行符。put盡量不使用姑宽。
-
二進制IO
二進制IO操作遣耍,需要一次讀或寫整個結構,如果通過調(diào)用 fputs 和 fgets 實現(xiàn)炮车,由于二進制IO過程中可能會提供 null 字節(jié)而不能正確工作,提供以下函數(shù)舵变。
一般有以下兩種常見用法,讀寫一個數(shù)組和讀一個結構瘦穆。
#include <stdio.h>
int main ()
{
FILE *fp = fopen ("output.txt", "w");
float data[10] = {0, 12, 1.414, 3.562, 43213, 4214};
if (fwrite (data, sizeof(float), 10, fp) != 10)
{
perror ("fwrite error: ");
return -1;
}
return 0;
}
#include <stdio.h>
#include <string.h>
#define NAMESIZE 1024
struct Str_tmp
{
short count;
long total;
char name[NAMESIZE];
};
int main ()
{
struct Str_tmp item;
scanf ("%s", item.name);
item.count = strlen (item.name);
item.total = 1024;
FILE *fp = fopen ("output.txt", "w");
if (fwrite (&item, sizeof(item), 1, fp) != 1)
{
perror ("fwrite error: ");
return -1;
}
return 0;
}
- 定位流
- 格式化IO