(原創) 如何讀取/寫入文字檔? (C)
Abstract
雖然C++提供了較簡單的方式如寫文字檔,不過在嵌入式系統,C語言仍較受歡迎,本文討論如何用C語言讀寫文字檔。
Introduction
之前大都使用C++讀取文字檔,所以對傳統C語言的方式反而不熟悉,由於在(原創) 如何讀取文/寫入字檔? (IC Design) (Verilog)使用了Verilog讀取文字檔,發現Verilog的寫法竟然與C語言非常相似,再加上C語言在嵌入式系統較受歡迎,所以也一併學習了C語言的方式。
C語言
1 /*
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : FileIO.c
5 Compiler : Visual C++ 8.0
6 Description : Demo how to access text file
7 Release : 02/11/2008 1.0
8 */
9
10 #include <stdio.h>
11
12 int main() {
13 int reg1, reg2, reg3;
14
15 FILE *fp_r = fopen("data_in.txt", "r");
16 FILE *fp_w = fopen("data_out.txt", "w");
17
18 if (fp_r == NULL)
19 return -1;
20
21 if (fp_w == NULL)
22 return -1;
23
24 while(!feof(fp_r)) {
25 fscanf(fp_r, "%d %d %d", ®1, ®2, ®3);
26 printf("%d %d %d\n", reg1, reg2, reg3);
27 fprintf(fp_w, "%d %d %d\n", reg3, reg2, reg1);
28 }
29
30 fclose(fp_r);
31 fclose(fp_w);
32 }
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : FileIO.c
5 Compiler : Visual C++ 8.0
6 Description : Demo how to access text file
7 Release : 02/11/2008 1.0
8 */
9
10 #include <stdio.h>
11
12 int main() {
13 int reg1, reg2, reg3;
14
15 FILE *fp_r = fopen("data_in.txt", "r");
16 FILE *fp_w = fopen("data_out.txt", "w");
17
18 if (fp_r == NULL)
19 return -1;
20
21 if (fp_w == NULL)
22 return -1;
23
24 while(!feof(fp_r)) {
25 fscanf(fp_r, "%d %d %d", ®1, ®2, ®3);
26 printf("%d %d %d\n", reg1, reg2, reg3);
27 fprintf(fp_w, "%d %d %d\n", reg3, reg2, reg1);
28 }
29
30 fclose(fp_r);
31 fclose(fp_w);
32 }
執行結果
2 3 4
5 6 4
5 6 4
data_in.txt
1 2 3
4 5 6
4 5 6
data_out.txt
3 2 1
6 5 4
6 5 4
15行
FILE *fp_r = fopen("data_in.txt", "r");
FILE *fp_w = fopen("data_out.txt", "w");
FILE *fp_w = fopen("data_out.txt", "w");
fopen()執行開檔的動作,第一個參數是檔案名稱,第二個參數r代表read,w代表write。值得注意的是,file handle是一個FILE *,根據stdio.h的定義,FILE是一個struct的typedef,定義如下:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
所以fp_r是一個pointer to struct。
24行
while(!feof(fp_r)) {}
使用while迴圈,若不是最後一行,則一直讀取。
25行
fscanf(fp_r, "%d %d %d", ®1, ®2, ®3);
fscanf()類似scanf(),將資料從文字檔讀入變數,和scanf()一樣,要傳入的是變數的位址,而非變數而已。
27行
fprintf(fp_w, "%d %d %d\n", reg3, reg2, reg1);
fprintf()類似printf(),將資料從變數寫入文字檔。
30行
fclose(fp_r);
fclose(fp_w);
fclose(fp_w);
對文字檔進行關檔的動作。
Conclusion
C語言讀寫文字檔的方式和Verilog非常類似,其實是Verilog刻意去學習C語言。