(原創) 如何讀取/寫入文字檔? (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"&reg1, &reg2, &reg3);
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

data_in.txt

1 2 3
4 5 6

data_out.txt

3 2 1
6 5 4

15行

FILE *fp_r = fopen("data_in.txt", "r");
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;


所以fp_r是一個pointer to struct。

 
24行

while(!feof(fp_r)) {}


使用while迴圈,若不是最後一行,則一直讀取。


25行

fscanf(fp_r, "%d %d %d", &reg1, &reg2, &reg3);


fscanf()類似scanf(),將資料從文字檔讀入變數,和scanf()一樣,要傳入的是變數的位址,而非變數而已。


27行

fprintf(fp_w, "%d %d %d\n", reg3, reg2, reg1);


fprintf()類似printf(),將資料從變數寫入文字檔。


30行

fclose(fp_r);
fclose(fp_w);


對文字檔進行關檔的動作。

Conclusion
C語言讀寫文字檔的方式和Verilog非常類似,其實是Verilog刻意去學習C語言。

See Also
(原創) 如何讀取文/寫入字檔? (IC Design) (Verilog)

posted on 2008-02-11 14:47  真 OO无双  阅读(...)  评论(... 编辑 收藏

导航

统计