C/C++

File I/O in C

Xin chào, trong bài viết này chúng ta sẽ tìm hiểu về cách truy cập và xử lý file với ngôn ngữ C.


OPENING FILE

Trước khi có thể đọc hoặc ghi file, chúng ta cần mở file với function fopen.

FILE *filePointer = fopen(const char* fileName, const char* mode)

Trong đó:

  • fileName – tên file hoặc đường dẫn (path) đến file cần mở;
  • mode – chế độ làm việc với file sau khi mở, gồm:
  1. “w” – tạo một file text để ghi, nếu file này đã tồn tại thì nội dung của nó sẽ bị xóa;
  2. “r” – mở một file text để đọc, không tạo file mới nếu nó chưa tồn tại (con trỏ sẽ bằng NULL);
  3. “a” – mở hoặc tạo một file text để ghi thêm vào cuối file;
  4. “w+” – tạo một file text để đọc và ghi, nếu file này đã tồn tại thì nội dung của nó sẽ bị xóa;
  5. “r+” – mở một file text để đọc và ghi, không tạo file mới nếu nó chưa tồn tại (con trỏ sẽ bằng NULL);
  6. “a+” – mở hoặc tạo một file text để đọc và ghi thêm vào cuối file;
  7. “wb”, “rb”, “ab”, “wb+”, “rb+”, “ab+” – tương tự với các chế độ trên nhưng dùng cho ghi/đọc raw bytes thay vì ký tự.
  • filePointer – con trỏ đến file vừa được mở.

Tóm lại, khi mở một file để ghi mới hoặc ghi thêm dữ liệu, nếu file này chưa tồn tại thì nó sẽ được tạo mới. Khi mở một file để đọc mà file này chưa tồn tại hoặc chúng ta không có quyền truy cập thì fopen() sẽ trả về NULL.


CHARACTER OUTPUT

Để ghi dữ liệu ở dạng ký tự vào một file chúng ta có thể sử dụng các functions sau: fprintf(), fputc(), fputs().

Functions:

  • int fprintf(FILE *filePointer, const char *format,…) – ghi chuỗi ký tự vào file theo format; giá trị trả về là số lượng ký tự được ghi, nếu có lỗi thì trả về một số âm;
  • int fputc(int c, FILE *filePointer) – ghi một ký tự vào file; giá trị trả về chính là ký tự đó hoặc EOF nếu có lỗi;
  • int fputs(const char *s, FILE *filePointer) – ghi một string vào file; trả về EOF nếu có lỗi.

CHARACTER INPUT

Để đọc dữ liệu ở dạng ký tự từ một file chúng ta có thể sử dụng các functions sau: fscanf(), fgetc(), fgets().

Functions:

  • int fscanf(FILE *filePointer, const char *format,…) – đọc dữ liệu từ file theo format; giá trị trả về là số trường dữ liệu đã đọc, nếu có lỗi thì trả về một số âm;
  • int fgetc(FILE *filePointer) – đọc một ký tự từ file; giá trị trả về chính là ký tự đó hoặc EOF nếu có lỗi;
  • char* fgets(char *s, int n, FILE *filePointer) – đọc n-1 ký tự từ file vào mảng s, mảng s được kết thúc bởi ký tự \0; trả về chuỗi s hoặc EOF nếu có lỗi.

DIRECT OUTPUT

Để ghi dữ liệu ở dạng binary (raw bytes) vào một file chúng ta sử dụng function fwrite():

size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE * filePointer)

Trong đó:

  • ptr – mảng chứa dữ liệu cần ghi vào file;
  • size – kích thước của một đơn vị dữ liệu có trong mảng ptr;
  • nobj – số lượng dữ liệu cần ghi vào file;
  • filePointer – con trỏ đến file cần ghi.

DIRECT INPUT

Để đọc dữ liệu ở dạng binary (raw bytes) từ một file chúng ta sử dụng function fread():

size_t fread(void *ptr, size_t size, size_t nobj, FILE * filePointer)

Trong đó:

  • ptr – mảng chứa dữ liệu sẽ được đọc từ file;
  • size – kích thước của một đơn vị dữ liệu sẽ được đọc;
  • nobj – số lượng dữ liệu sẽ được đọc từ file;
  • filePointer – con trỏ đến file cần đọc.

EXAMPLES

Example 1 – Read/Write a text file.

Source code: test.c

#include "stdio.h"
#include "stdlib.h"
#include "errno.h"

int main( ) {
    FILE *filePointer = fopen("textFile.txt", "w");
    char data[32];
    int d;

    if (filePointer == NULL) {
        perror("Error");
        exit(1);
    }
    fputs("codelungtung 2018", filePointer);
    fclose(filePointer);

    filePointer = fopen("textFile.txt", "r");
    int a = fscanf(filePointer, "%s%d", data, &d);
    puts(data);
    printf("%d\n", d);

    fclose(filePointer);
    return 0;
}

Execution:
$ gcc test.c -o test
$ ./test

Output:
codelungtung
2018

Example 2 – Write/Read a binary file

Source code: test.c

#include "stdio.h"
#include "stdlib.h"
#include "errno.h"

int main( ) {
	FILE *filePointer = fopen("binaryFile", "wb");
    int data[10] = {0,1,2,3,4,5,6,7,8,9};
    int buffer[10];
    int d;

    if (filePointer == NULL) {
        perror("Error");
        exit(1);
    }
    fwrite(data, sizeof(int), 10, filePointer);
    fclose(filePointer);

    filePointer = fopen("binaryFile", "rb");
    fread(buffer, sizeof(int), 10, filePointer);

    fclose(filePointer);

    for (int i = 0; i < 10; i++)
        printf("%d\t", buffer[i]);
    printf("\n");
	return 0;
}

Execution:
$ gcc test.c -o test
$ ./test

Output:
0    1    2    3    4    5    6    7    8    9


SUMMARY

Như vậy chúng ta đã tìm hiểu cách truy cập và xử lý dữ liệu từ file với sự hỗ trợ của C Standard Library. Cảm ơn các bạn đã theo dõi bài viết.

Thân ái và quyết thắng.

Reference:
[1] tutorialspoint.com C File I/O.
[2] The C programming language, Chapter 7 – File Access.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s