標準常用IO函式庫
2008年9月8日 星期一 by Anati
常常資料要輸出輸入的,如果對於函式不熟的話又要常常去翻書查,這邊介紹最常用的檔案處理函式和基本輸出入函式,還有函式的使用範例。
※ 檔案輸出入函式
* FILE* fopen(const char* filename, const char* mode) 開啟檔案
* mode: r, w, a, r+, w+, a+, rb, wb, ab
* 成功回傳檔案指標FILE* stream
* 失敗回傳NULL
Example:
FILE* fp;
if (!(fp = fopen("data.txt", "r")))
{
puts("file open error");
exit(1);
}
* int fclose(FILE* stream) 關閉檔案
* 成功回傳0
* 失敗回傳EOF
Example:
if (fclose(fp))
{
puts("close file error");
exit(1);
}
* int fgetc(FILE* stream) 從檔案中取得一個字元
* 成功回傳字元
* 失敗回傳EOF
Example:
char ch;
while ((ch = fgetc(fp)) != EOF)
{
putchar(toupper(ch));
}
* int fputc(int ch, FILE* stream) 輸出一個字元到檔案中
Example:
char ch;
while ((ch = getchar()) != EOF)
{
fputc(ch, fp);
}
* int fscanf(FILE* stream, const char* format, ...) 格式化從檔案讀入
* 成功回傳讀到的個數
* 失敗回傳EOF
Example:
while (fscanf(fp, "%d%s%d", &id, name, &score) == 3)
{
printf("id: %d name: %s score: %d\n", id, name, score);
}
* int ungetc(int ch, FILE* stream) 把已取出來的字元塞回去stream中
Example:
char ch;
while ((ch = getchar()) != EOF)
{
if (ch == 'b' || ch == 'd')
{
ungetc(ch);
}
}
* int fprintf(FILE* stream, const char* format, ...) 格式化輸出到檔案
Example:
const char* str = "test1";
fprintf(fp, "%s\n", str);
* char* fgets(char* str, int num, FILE* stream) 從檔案中一次讀取一行
* 成功回傳str
* 失敗回傳NULL
Example:
char buf[80];
while (fgets(buf, sizeof(buf), fp))
{
puts(buf);
}
* int fputs(const char* str, FILE* stream) 一次寫入一行到檔案之中
* 不會加上換行符號
Example:
const char* str = "test";
fputs(str, fp);
* int fread(void* buffer, size_t size, size_t num, FILE* stream) 二元讀檔
* 成功回傳讀取到的個數
* 失敗回傳0 (讀取0個)
Example:
int count;
double buffer[10];
while ((count = fread(buffer, sizeof(*buffer), 10, fp)))
{
printf("file readed count: %d\n", count);
}
* int fwrite(void* buffer, size_t size, size_t num, FILE* stream) 二元寫檔
* 成功回傳寫入的個數
* 失敗回傳0 (寫入0個)
Example:
int buffer[80];
int success;
if ((success = fwrite(buffer, sizeof(*buffer), 80, fp)))
{
printf("write success count: %d\n", success);
}
* int fseek(FILE* stream, long offset, int flag) 移動檔案指標
* flag: SEEK_SET, SEEK_CUR, SEEK_END
* void rewind(FILE* stream) 移動檔案指標到檔案起始處
* long ftell(FILE* stream) 回傳目前檔案位子(可計算檔案大小)
Example:
long file_size;
fseek(fp, 0, SEEK_END);
file_size = ftell(fp);
rewind(fp);
* int fflush(FILE* stream) 清除緩衝區將緩衝區寫入檔案
Example:
fflush(stdout);
fflush(fp);
* void perror(const char* str) 印出開讀檔案時的錯誤資訊
Example:
FILE* fp;
if (!(fp = fopen("data.txt", "r")))
{
const char* str = "Error message with data.txt";
perror(str);
exit(1);
}
※ 標準輸出入函式
* int getchar(void) 從stdin讀取一個字元
* 成功回傳字元
* 失敗回傳EOF
Example:
char ch;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
* int putchar(int ch) 輸出一個字元到stdout
Example:
char ch = 'a';
putchar(ch);
* int scanf(const char* format, ...) 格式化從stdin讀取資料
* int printf(const char* format, ...) 輸出格式資料到stdout中
※ 字元字陣輸出入函式
* int sscanf(const char* buffer, const char* format, ...) 從buffer中格式化讀取資
Example:
char buffer[80]
while (fgets(buffer, sizeof(buffer), stdin))
{
int id;
char name[20];
sscanf(buffer, "%d%s", &id, name);
}
* int sprintf(char* buffer, const char* format, ...) 將格式化的資料寫入buffer中
Example:
char buffer[80];
sprintf(buffer, "%.2f", 449.382);
puts(buffer);
※ 檔案輸出入函式
* FILE* fopen(const char* filename, const char* mode) 開啟檔案
* mode: r, w, a, r+, w+, a+, rb, wb, ab
* 成功回傳檔案指標FILE* stream
* 失敗回傳NULL
Example:
FILE* fp;
if (!(fp = fopen("data.txt", "r")))
{
puts("file open error");
exit(1);
}
* int fclose(FILE* stream) 關閉檔案
* 成功回傳0
* 失敗回傳EOF
Example:
if (fclose(fp))
{
puts("close file error");
exit(1);
}
* int fgetc(FILE* stream) 從檔案中取得一個字元
* 成功回傳字元
* 失敗回傳EOF
Example:
char ch;
while ((ch = fgetc(fp)) != EOF)
{
putchar(toupper(ch));
}
* int fputc(int ch, FILE* stream) 輸出一個字元到檔案中
Example:
char ch;
while ((ch = getchar()) != EOF)
{
fputc(ch, fp);
}
* int fscanf(FILE* stream, const char* format, ...) 格式化從檔案讀入
* 成功回傳讀到的個數
* 失敗回傳EOF
Example:
while (fscanf(fp, "%d%s%d", &id, name, &score) == 3)
{
printf("id: %d name: %s score: %d\n", id, name, score);
}
* int ungetc(int ch, FILE* stream) 把已取出來的字元塞回去stream中
Example:
char ch;
while ((ch = getchar()) != EOF)
{
if (ch == 'b' || ch == 'd')
{
ungetc(ch);
}
}
* int fprintf(FILE* stream, const char* format, ...) 格式化輸出到檔案
Example:
const char* str = "test1";
fprintf(fp, "%s\n", str);
* char* fgets(char* str, int num, FILE* stream) 從檔案中一次讀取一行
* 成功回傳str
* 失敗回傳NULL
Example:
char buf[80];
while (fgets(buf, sizeof(buf), fp))
{
puts(buf);
}
* int fputs(const char* str, FILE* stream) 一次寫入一行到檔案之中
* 不會加上換行符號
Example:
const char* str = "test";
fputs(str, fp);
* int fread(void* buffer, size_t size, size_t num, FILE* stream) 二元讀檔
* 成功回傳讀取到的個數
* 失敗回傳0 (讀取0個)
Example:
int count;
double buffer[10];
while ((count = fread(buffer, sizeof(*buffer), 10, fp)))
{
printf("file readed count: %d\n", count);
}
* int fwrite(void* buffer, size_t size, size_t num, FILE* stream) 二元寫檔
* 成功回傳寫入的個數
* 失敗回傳0 (寫入0個)
Example:
int buffer[80];
int success;
if ((success = fwrite(buffer, sizeof(*buffer), 80, fp)))
{
printf("write success count: %d\n", success);
}
* int fseek(FILE* stream, long offset, int flag) 移動檔案指標
* flag: SEEK_SET, SEEK_CUR, SEEK_END
* void rewind(FILE* stream) 移動檔案指標到檔案起始處
* long ftell(FILE* stream) 回傳目前檔案位子(可計算檔案大小)
Example:
long file_size;
fseek(fp, 0, SEEK_END);
file_size = ftell(fp);
rewind(fp);
* int fflush(FILE* stream) 清除緩衝區將緩衝區寫入檔案
Example:
fflush(stdout);
fflush(fp);
* void perror(const char* str) 印出開讀檔案時的錯誤資訊
Example:
FILE* fp;
if (!(fp = fopen("data.txt", "r")))
{
const char* str = "Error message with data.txt";
perror(str);
exit(1);
}
※ 標準輸出入函式
* int getchar(void) 從stdin讀取一個字元
* 成功回傳字元
* 失敗回傳EOF
Example:
char ch;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
* int putchar(int ch) 輸出一個字元到stdout
Example:
char ch = 'a';
putchar(ch);
* int scanf(const char* format, ...) 格式化從stdin讀取資料
* int printf(const char* format, ...) 輸出格式資料到stdout中
※ 字元字陣輸出入函式
* int sscanf(const char* buffer, const char* format, ...) 從buffer中格式化讀取資
Example:
char buffer[80]
while (fgets(buffer, sizeof(buffer), stdin))
{
int id;
char name[20];
sscanf(buffer, "%d%s", &id, name);
}
* int sprintf(char* buffer, const char* format, ...) 將格式化的資料寫入buffer中
Example:
char buffer[80];
sprintf(buffer, "%.2f", 449.382);
puts(buffer);