Đọc ghi File trong C – Thao tác làm việc với File trong C chi tiết

1. Đặc tả tập tin trong lập trình C

Trong phần này, bạn sẽ được tìm hiểu về đặc tả tập tin trong ngôn ngữ lập trình C. Bạn cũng sẽ học được cách xử lý luồng vào ra tiêu chuẩn trong lập trình C bằng cách sử dụng fprintf(), fscanf(), fread(), fwrite(), fseek(),… thông qua các ví dụ.

Tệp (File) là một vùng chứa trong các thiết bị lưu trữ của máy tính được sử dụng để lưu trữ dữ liệu.

doc ghi file trong c1.1 Vì sao các tệp lại quan trọng?

  •  Khi một lập trình kết thúc, toàn bộ dữ liệu sẽ bị mất. Lưu trữ vào tệp sẽ giúp bảo toàn dữ liệu của bạn ngay cả khi lập trình kết thúc.
  • Bạn sẽ mất rất nhiều thời gian để nhập một lượng dữ liệu lớn vào. Tuy nhiên, nếu bạn có một tệp chứa tất cả dữ liệu, bạn sẽ dễ dàng truy cập vào nội dung của tệp đó bằng cách sử dụng một vài lệnh trong lập trình C.
  • Bạn có thể dễ dàng di chuyển dữ liệu của mình từ máy tính này sang máy tính khác mà không có bất cứ sự thay đổi nào.

1.2 Các loại tệp

Có 2 loại tệp sau đây:

  1. Tệp văn bản
  2. Tập tin nhị phân

1.2.1 Tệp văn bản

Tệp văn bản là tệp .txt bình thường. Bạn có thể dễ dàng tạo ra tệp văn bản bằng những trình soạn thảo văn bản như Notepad.

Khi mở những tệp này, bạn sẽ thấy tất cả nội dung trong đó là những văn bản thuần túy. Bạn có thể dễ dàng chỉnh sửa hoặc xóa những nội dung trong tệp.

Dù các tệp văn bản không có tính bảo mật cao và chiếm không gian lưu trữ lớn, nhưng chúng lại dễ đọc.

1.2.2 Tập tin nhị phân

Các tập tin nhị phân chủ yếu là các tệp bin. trong máy tính của bạn.

Thay vì lưu trữ dữ liệu dưới dạng văn bản thuần túy thì chúng lưu trữ dữ liệu dưới dạng nhị phân (0 và 1).

Các tập tin nhị phân có thể chứa lượng lớn dữ liệu nhưng chúng không dễ đọc và có tính bảo mật cao hơn các tệp văn bản.

1.3 Các thao tác với file trong C

Bạn có thể thực hiện 4 thao tác với file trong C (kể cả tệp văn bản hay tập tin nhị phân) như sau:

  1. Tạo file mới
  2. Mở file đang có
  3. Đóng file
  4. Đọc ghi file trong C

1.3.1 Làm việc với file trong C

Khi làm việc với file trong C, bạn cần khai báo con trỏ của kiểu tệp. Khai báo giúp tạo kết nối giữa tệp và lập trình.

FILE *fptr;

1.3.2 Mở file – để tạo và chỉnh sửa

Để có thể đọc ghi file trong C, trước hết bạn phải mở tệp bằng cách sử dụng hàm fopen trong C được xác định trong tệp tiêu đề stdio.h.

Cú pháp để mở tệp trong luồng vào ra tiêu chuẩn như sau:

ptr = fopen(“fileopen”,”mode”);

Ví dụ,

fopen(“E:\\cprogram\\newprogram.txt”,”w”);

fopen(“E:\\cprogram\\oldprogram.bin”,”rb”);

Giả sử tệp newprogram.txt không tồn tại ở vị trí E:\cprogram. Hàm đầu tiên sẽ tạo ra một tệp mới có tên là newprogram.txt và mở tệp này. Bạn có thể thêm văn bản vào tệp bởi chế độ của tệp này là ‘w’.

Thuộc tính writing mode cho phép bạn tạo hoặc chỉnh sửa nội dung của một tệp.

Xét đến tập tin nhị phân thứ 2. Giả sử tập tin nhị phân oldprogram.bin tồn tại ở vị trí E:\cprogram. Hàm thứ 2 sẽ mở tập tin đang có và bạn có thể đọc được được nội dung ở chế độ nhị phân ‘rb‘.

Tính năng đọc chỉ cho phép bạn đọc tệp nhưng không thể ghi dữ liệu vào tệp được.

Bảng. Các chế độ mở trong luồng ra vào tiêu chuẩn trong lập trình C

Chế độ Ý nghĩa của chế độ Trong thời gian tệp không tồn tại
r Mở để đọc Nếu tệp không tồn tại, fopen() trả về NULL.
rb Mở để đọc ở chế độ nhị phân. Nếu tệp không tồn tại, fopen() trả về  NULL.
w Mở để ghi dữ liệu Nếu tệp tồn tại, nội dung của nó sẽ được ghi đè lên

Nếu tệp không tồn tại, sẽ tạo một tệp mới.

wb Mở để ghi dữ liệu trong chế độ nhị phân Nếu tệp tồn tại, nội dung của nó sẽ được ghi đè lên

Nếu tệp không tồn tại, sẽ tạo một tệp mới.

a Mở để bổ sung dữ liệu

Thêm dữ liệu vào phần cuối tệp

Nếu tệp không tồn tại, sẽ tạo một tệp mới.
ab Mở để bổ sung dữ liệu trong chế độ nhị phân

Thêm dữ liệu vào phần cuối  tệp

Nếu tệp không tồn tại, sẽ tạo một tệp mới.
r+ Mở để đọc và ghi dữ liệu vào Nếu tệp không tồn tại fopen() trả về NULL.
rb+ Mở để đọc và ghi dữ liệu trong chế độ nhị phân Nếu tệp không tồn tại fopen() trả về NULL
w+ Mở để đọc và ghi dữ liệu vào Nếu tệp tồn tại, nội dung của nó sẽ được ghi đè lên

Nếu tệp không tồn tại, sẽ tạo một tệp mới.

wb+ Mở để đọc và ghi dữ liệu vào trong chế độ nhị phân Nếu tệp tồn tại, nội dung của nó sẽ được ghi đè lên

Nếu tệp không tồn tại, sẽ tạo một tệp mới.

a+ Mở để đọc và bổ sung dữ liệu Nếu tệp không tồn tại, sẽ tạo một tệp mới.
ab+ Mở để đọc và bổ sung dữ liệu trong chế độ nhị phân Nếu tệp không tồn tại, sẽ tạo một tệp mới.

1.3.3 Đóng tệp

Bạn phải đóng tệp (cả tệp văn bản và tập tin nhị phân) sau khi đọc ghi file trong C.

Sử dụng hàm fclose() để đóng tệp.

fclose(fptr);

fptr là một con trỏ tệp được liên kết với tệp sẽ được đóng.

1.3.4 Đọc ghi dữ liệu từ file văn bản trong C

Để đọc và ghi dữ liệu vào tệp văn bản, bạn sử dụng hàm fprintf và fscanf trong C

2 hàm trên là những phiên bản khác của lần lượt 2 hàm printf() và scanf(). Tuy nhiên, có một sự khác biệt: 2 hàm fprint() và fscanf() sẽ chỉ dẫn con trỏ đến cấu trúc FILE.

Ví dụ 1: ghi dữ liệu vào file văn bản

#include <stdio.h>

#include <stdlib.h>

int main()

{

int num;

FILE *fptr;

// use appropriate location if you are using MacOS or Linux

fptr = fopen(“C:\\program.txt”,”w”);

if(fptr == NULL)

{

printf(“Error!”);

exit(1);

}

printf(“Enter num: “);

scanf(“%d”,&num);

fprintf(fptr,”%d”,num);

fclose(fptr);

return 0;

}

Lập trình này sẽ lấy một số do người dùng nhập rồi lưu trữ nó trong tệp program.txt.

Sau khi thực hiện biên dịch và chạy lập trình, bạn sẽ thấy tệp văn bản program.txt đã được tạo trong ổ C của máy tính. Khi mở tệp này, bạn sẽ thấy số nguyên mà bạn đã nhập vào.

Ví dụ 2: Đọc file trong C

#include <stdio.h>

#include <stdlib.h>

int main()

{

int num;

FILE *fptr;

if ((fptr = fopen(“C:\\program.txt”,”r”)) == NULL){

printf(“Error! opening file”);

// Program exits if the file pointer returns NULL.

exit(1);

}

fscanf(fptr,”%d”, &num);

printf(“Value of n=%d”, num);

fclose(fptr);

return 0;

}

Lập trình này sẽ đọc số nguyên đang có trong tệp tin program.txt và in nó lên màn hình.

Chẳng hạn, khi lập trình ở ví dụ 1 chạy, nó sẽ nhận được số nguyên mà bạn đã nhập vào.

Các hàm fgetchar(), fputc(),… cũng được sử dụng tương tự như trên.

1.3.5 Đọc và ghi dữ liệu vào tập tin nhị phân

Khi muốn đọc hoặc ghi dữ liệu vào tập tin nhị phân, bạn sử dụng tệp fread và fwrite trong C.

Ghi dữ liệu vào tập tin nhị phân.

Sử dụng hàm fwrite() để ghi dữ liệu vào tập tin nhị phân. Hàm này có 4 đối số như sau:

  1. địa chỉ của dữ liệu được ghi vào đĩa
  2. kích thước của dữ liệu được ghi vào đĩa
  3. số lượng các loại dữ liệu này
  4. đưa con trỏ đến tệp mà bạn muốn ghi dữ liệu.

fwrite(addressData, sizeData, numbersData, pointerToFile);

Ví dụ 3: Ghi dữ liệu vào tệp nhị phân bằng hàm fwrite trong C

#include <stdio.h>

#include <stdlib.h>

struct threeNum

{

int n1, n2, n3;

};

int main()

{

int n;

struct threeNum num;

FILE *fptr;

if ((fptr = fopen(“C:\\program.bin”,”wb”)) == NULL){

printf(“Error! opening file”);

// Program exits if the file pointer returns NULL.

exit(1);

}

for(n = 1; n < 5; ++n)

{

num.n1 = n;

num.n2 = 5*n;

num.n3 = 5*n + 1;

fwrite(&num, sizeof(struct threeNum), 1, fptr);

}

fclose(fptr);

return 0;

}

Trong lập trình này, tôi tạo một tệp program.bin mới trong ổ C.

Tôi đã khai báo cấu trúc threeNum với 3 số là n1, n2 và n3 và xác định nó thuộc kiểu num trong hàm (main).

Bên trong vòng lặp for, tôi sử dụng hàm fwrite() để lưu giá trị vào tệp.

Tham số đầu tiên lấy địa chỉ của num và tham số thứ 2 lấy kích thước của cấu trúc threeNum.

Vì tôi chỉ chèn vào một num nên tham số thứ 3 là 1. Và tham số cuối cùng *fptr sẽ trỏ đến tệp mà tôi đang dùng để lưu trữ dữ liệu.

Cuối cùng, tôi đóng tệp sau khi hoàn thành đọc ghi file trong C

Đọc dữ liệu từ tập tin nhị phân

Hàm fread trong C cũng có 4 đối số tương tự như hàm fwrite().

fread(addressData, sizeData, numbersData, pointerToFile);

Ví dụ 4: Đọc dữ liệu từ tệp nhị phân bằng hàm fread trong C

#include <stdio.h>

#include <stdlib.h>

struct threeNum

{

int n1, n2, n3;

};

int main()

{

int n;

struct threeNum num;

FILE *fptr;

if ((fptr = fopen(“C:\\program.bin”,”rb”)) == NULL){

printf(“Error! opening file”);

// Program exits if the file pointer returns NULL.

exit(1);

}

for(n = 1; n < 5; ++n)

{

fread(&num, sizeof(struct threeNum), 1, fptr);

printf(“n1: %d\tn2: %d\tn3: %d”, num.n1, num.n2, num.n3);

}

fclose(fptr);

return 0;

}

Trong lập trình này, tôi sẽ lướt qua từng bản ghi một trong cùng một tệp program.bin

Nói một cách dễ hiểu, tôi sẽ đọc bản ghi threeNum trong tệp threeNum. Bản ghi này nằm trong tệp được chỉ định bởi hàm *fptr trong cấu trúc num.

1.3.6 Lấy dữ liệu bằng cách sử dụng hàm fseek()

Nếu trong một tệp có nhiều bản ghi và bạn chỉ muốn truy cập vào một bản ghi ở một vị trí cụ thể, bạn cần phải lướt qua tất các bản ghi trước khi lấy được bản ghi mà mình mong muốn.

Sẽ mất rất nhiều thời gian và công sức để hoàn thành nhiệm vụ này. Tuy nhiên, chỉ cần sử dụng hàm fseek() là bạn sẽ dễ dàng truy cập vào dữ liệu đang cần.

Hàm fseek() sẽ đưa con trỏ đến bản ghi mà bạn muốn tìm trong tệp.

Cú pháp của fseek ()

fseek(FILE * stream, long int offset, int whence);

Luồng tham số đầu tiên là con trỏ chỉ đến tệp. Tham số thứ 2 chính là vị trí nơi mà bản ghi được tìm thấy và tham số thứ 3 chính là vị trí mà con trỏ bắt đầu

Bảng: Các vị trí bắt đầu khác nhau trong hàm fseek()

Whence Ý nghĩa
SEEK_SET Bắt đầu từ vị trí đầu tệp
SEEK_END Bắt đầu từ vị trí cuối tệp
SEEK_CUR Bắt đầu từ vị trí hiện tại của con trỏ trong tệp
Ví dụ 5: fseek()

#include <stdio.h>

#include <stdlib.h>

struct threeNum

{

int n1, n2, n3;

};

int main()

{

int n;

struct threeNum num;

FILE *fptr;

if ((fptr = fopen(“C:\\program.bin”,”rb”)) == NULL){

printf(“Error! opening file”);

// Program exits if the file pointer returns NULL.

exit(1);

}

// Moves the cursor to the end of the file

fseek(fptr, -sizeof(struct threeNum), SEEK_END);

for(n = 1; n < 5; ++n)

{

fread(&num, sizeof(struct threeNum), 1, fptr);

printf(“n1: %d\tn2: %d\tn3: %d\n”, num.n1, num.n2, num.n3);

fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);

}

fclose(fptr);

return 0;

}

Lập trình này sẽ bắt đầu đọc những bản ghi từ tệp program.bin theo thứ tự từ dưới lên trên và in nó ra.

2. Thông tin thêm về C

2.1 Kiểu liệt kê trong lập trình C

Trong phần này, bạn sẽ được tìm hiểu về liệt kê trong ngôn ngữ lập trình C thông qua các ví dụ.

Trong lập trình C, kiểu liệt kê (hay còn gọi là enum) là kiểu dữ liệu bao gồm các hằng số tích phân. Sử dụng từ khóa enum để xác định kiểu liệt kê.

enum flag {const1, const2, …, constN};

Theo mặc định, const1 là 0, const2 là 1,…) Bạn có thể thay đổi giá trị mặc định của các phần tử enum trong quá trình khai báo (nếu thực sự cần).

// Changing default values of enum constants

enum suit {

club = 0,

diamonds = 10,

hearts = 20,

spades = 3,

};

2.1.1 Khai báo kiểu liệt kê

Ngay khi bạn xác định được kiểu liệt kê thì bản thiết kế cho biến sẽ được tạo ra. Dưới đây là cách tạo các biến của các kiểu liệt kê

enum boolean {false, true};

enum boolean check; // declaring an enum variable

Ở đây, biến check của loại enum boolean được tạo ra.

Bạn cũng có thể khai báo biến enum như sau:

enum boolean {false, true} check;

Giá trị của false bằng 0 và giá trị của true bằng 1.

Ví dụ: Kiểu liệt kê

#include <stdio.h>

enum week {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};

int main()

{

// creating today variable of enum week type

enum week today;

today = Wednesday;

printf(“Day %d”,today+1);

return 0;

}

Output

Day 4

2.1.2 Vì sao nên sử dụng enums?

Biến enum chỉ có thể nhận một giá trị. Dưới đây là ví dụ chứng minh:

#include <stdio.h>

enum suit {

club = 0,

diamonds = 10,

hearts = 20,

spades = 3

} card;

int main()

{

card = club;

printf(“Size of enum variable = %d bytes”, sizeof(card));

return 0;

}

Đầu ra

Size of enum variable = 4 bytes

Kết quả in trên màn hình là 4 bởi vì kích thước của int là 4 byte

Do đó, enum chính là sự lựa chọn phù hợp với các cờ.

2.1.3 Làm thế nào để sử dụng enum làm cờ?

Hãy xem ví dụ dưới đây

enum designFlags {

ITALICS = 1,

BOLD = 2,

UNDERLINE = 4

} button;

Giả sử bạn đang thiết kế một nút cho ứng dụng trên Windows. Bạn có thể đặt cờ ITALICS, BOLD và UNDERLINE phù hợp với văn bản.

Đây là lý do vì sao tất cả các hằng số tích phân là lũy thừa của 2 trong mã giá trên.

// In binary

ITALICS = 00000001

BOLD = 00000010

UNDERLINE = 00000100

Vì các hằng số tích phân là lũy thừa của 2 nên bạn có thể kết hợp 2 hoặc nhiều cờ cùng một lúc mà không trùng lặp bằng cách sử dụng toán tử bitwise OR. Điều này cho phép bạn lựa chọn 2 hoặc nhiều cờ cùng một lúc. Ví dụ,

#include <stdio.h>

enum designFlags {

BOLD = 1,

ITALICS = 2,

UNDERLINE = 4

};

int main() {

int myDesign = BOLD | UNDERLINE;

// 00000001

//  | 00000100

//  ___________

// 00000101

printf(“%d”, myDesign);

return 0;

}

Đầu ra

5

Đầu ra là 5 có nghĩa là cờ bold và cờ underline được sử dụng.

Ngoài ra, bạn có thể thêm các cờ tùy thuộc vào nhu cầu của mình.

if (myDesign & ITALICS) {

// code for italics

}

Tôi đã thêm cờ italics vào thiết kế của mình. Lưu ý, chỉ viết code for italics bên trong  câu lệnh if.

Bạn có thể thực hiện các lập trình C mà không cần sử dụng đến phép liệt kê. Tuy nhiên, chúng cũng mang lại lợi ích trong một vài trường hợp nhất định.

3. Bộ tiền xử lý trong lập trình C

Trong phần này, bạn sẽ được tìm hiểu về bộ tiền xử lý trong lập trình C. Bên cạnh đó, bạn cũng được học về cách sử dụng #include, #define và biên dịch có điều kiện thông qua các ví dụ.

Bộ tiền xử lý trong lập trình C là bộ tiền xử lý macro (cho phép bạn xác định các macro) giúp chuyển đổi lập trình của bạn trước khi nó được biên dịch. Các chuyển đổi này có thể là tệp tiêu đề, mở rộng macro,…

Tất cả các chỉ thị tiền xử lý đều bắt đầu bằng ký hiệu #. Ví dụ,

#define PI 3.14

Một số cách sử dụng phổ biến của bộ tiền xử lý trong lập trình C:

3.1 Tệp tiêu đề including (bao gồm): #include

Bộ tiền xử lý của #include được sử dụng để đưa các tệp tiêu đề vào lập trình C. Ví dụ:

#include <stdio.h>

stdio.h chính là một tệp tiêu đề. Chỉ thị tiền xử lý #include thay thế dòng phía trên bằng cách sử dụng nội dung của tệp tiêu đề stdio.h.

Đó là lý do vì sao bạn cần sử dụng #include <stdio.h> trước khi dùng các hàm như scanf() và printf().

Bạn cũng có thể tạo các tệp tiêu đề chứa khai báo hàm và đưa nó vào lập trình của bạn bằng cách sử dụng chỉ thị tiền xử lý dưới đây

#include “my_header.h”

Truy cập vào trang này để biết thêm thông tin về cách sử dụng tệp tiêu đề.

3.2 Macro sử dụng #define

Marco là một đoạn code được đặt tên. Bạn có thể xác định marco trong lập trình C bằng cách sử dụng chỉ thị tiền xử lý #define.

Hãy xem ví dụ dưới đây

#define c 299792458  // speed of light

Khi được sử dụng trong lập trình, c sẽ được thay thế bằng 299792458.

Ví dụ 1: bộ tiền xử lý #define

#include <stdio.h>

#define PI 3.1415

int main()

{

float radius, area;

printf(“Enter the radius: “);

scanf(“%f”, &radius);

// Notice, the use of PI

area = PI*radius*radius;

printf(“Area=%.2f”,area);

return 0;

}

3.3 Hàm giống như các Macro

Bạn cũng có thể xem các macro hoạt động tương tự như lời gọi hàm. Chúng được gọi là function-like macro. Ví dụ

#define circleArea(r) (3.1415*(r)*(r))

Mỗi khi lập trình này gặp đối số circleArea(argument), nó sẽ được thay thế bằng (3.1415*(argument)*(argument).

Giả sử, tôi nhập 5 làm đối số và sau đó, nó sẽ được mở rộng như bên dưới:

circleArea(5) expands to (3.1415*5*5)

Ví dụ 2: Sử dụng bộ tiền xử lý #define

#include <stdio.h>

#define PI 3.1415

#define circleArea(r) (PI*r*r)

int main() {

float radius, area;

printf(“Enter the radius: “);

scanf(“%f”, &radius);

area = circleArea(radius);

printf(“Area = %.2f”, area);

return 0;

}

Truy cập vào trang này để biết thêm thông tin chi tiết về macro và bộ tiền xử lý #define.

3.4 Biên dịch có điều kiện

Trong lập trình C, bạn có thể thông báo với bộ tiền xử lý rằng có cần thêm một khối mã nhất định vào hay không. Sử dụng các chỉ thị có điều kiện để giải quyết vấn đề trên.

Nó tương tự như câu lệnh if nhưng vẫn có một vài điểm khác biệt.

Câu lệnh if được kiểm tra trong quá trình thực hiện kiểm tra một khối mã nên được thực thi hay không. Còn các chỉ thị có điều kiện được sử dụng để thêm (hoặc bỏ qua) một khối mã trong lập trình trước khi thực thi.

Cách sử dụng chỉ thị có điều kiện

  • sử dụng những mã khác nhau tùy thuộc vào máy và hệ điều hành
  • biên dịch cùng một tệp nguồn trong 2 lập trình khác nhau
  • có thể loại bỏ một mã nhất định ra khỏi lập trình nhưng vẫn lưu trữ lại cho những lần dùng tiếp theo.

3.4.1 Làm thế nào để sử dụng các chỉ thị có điều kiện?

Để sử dụng các chỉ thị có điều kiện, bạn dùng các chỉ thị #ifdef, #if, #defined, #else và #elseif.

#ifdef Directive

#ifdef MACRO

// conditional codes

#endif

Các mã có điều kiện chỉ được thêm vào lập trình khi MACRO được xác định

#if, #elif and #else Directive

#if expression

// conditional codes

#endif

expression là một biểu thức kiểu số nguyên (có thể là số nguyên, ký tự, biểu thức số học, macro,…)

Các mã điều kiện chỉ được thêm vào lập trình khi expression được đánh giá là có giá trị khác 0.

Chỉ thị #else mang tính tùy chọn có thể được sử dụng với chỉ thị #if.

#if expression

conditional codes if expression is non-zero

#else

conditional if expression is 0

#endif

Bạn cũng có thể thêm điều kiện lồng vào #if…#else bằng cách sử dụng #elif

#if expression

// conditional codes if expression is non-zero

#elif expression1

// conditional codes if expression is non-zero

#elif expression2

// conditional codes if expression is non-zero

#else

// conditional if all expressions are 0

#endif

#defined

Toán tử đặc biệt #defined được sử dụng để kiểm tra xem một macro nhất định có được xác định hay không. Nó thường được sử dụng với chỉ thị #if.

#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048

// codes

3.4.2 Các Macro được xác định trước

Dưới đây là một số macro được xác định trước trong lập trình C.

Macro Giá trị
__DATE__ Chuỗi chứa ngày hiện tại
__FILE__ Chuỗi chứa tên tệp
__LINE__ Một số nguyên đại diện cho số dòng hiện tại
__STDC__ If follows ANSI standard C, then the value is a nonzero integer

Nếu tuân theo tiêu chuẩn ANSI trong lập trình C, thì giá trị là một số nguyên khác 0

__TIME__ Chuỗi chứa ngày hiện tại
Ví dụ 3: Sử dụng __TIME__ để xác định thời gian hiện tại

Lập trình sau sẽ xuất đầu ra là thời gian hiện tại bằng cách sử dụng marco __TIME__.

#include <stdio.h>

int main()

{

printf(“Current time: %s”,__TIME__);

}

Đầu ra

Current time: 19:54:39

Tìm hiểu thêm:

  •         Điều khiển dòng
  •         Bộ tiền xử lý Pragmas
  •         Đầu ra của bộ tiền xử lý
  •         Các chỉ thị khác

4. Thư viện C chuẩn

4.1 Các hàm thư viện tiêu chuẩn trong lập trình C

Trong phần này, bạn sẽ được tìm hiểu về các hàm thư viện tiêu chuẩn trong lập trình C. Cụ thể là định nghĩa và các loại hàm thư viện khác nhau cũng như cách sử dụng chúng trong lập trình của bạn.

Các hàm thư viện chuẩn chính là những hàm đã sẵn có trong lập trình C.

Nguyên mẫu hàm và định nghĩa dữ liệu của những hàm này có trong các tệp tiêu đề tương ứng. Để sử dụng những hàm này, bạn cần thêm các tệp tiêu đề vào lập trình. Ví dụ,

Nếu muốn sử dụng hàm printf() thì bạn phải thêm tệp tiêu đề <stdio.h> vào.

#include <stdio.h>

int main()

{

printf(“Catch me if you can.”);

}

Nếu bạn cố gắng sử dụng hàm printf() mà không thêm tệp tiêu để stdio.h vào thì lập trình sẽ báo lỗi.

4.2 Những ưu điểm khi sử dụng các hàm thư viện C

  1. Các hàm chạy ổn định

Một trong những lý do quan trọng mà bạn nên sử dụng các hàm thư viện chính là chúng chạy rất ổn định. Các hàm này đã trải qua nhiều cuộc thử nghiệm nghiêm ngặt và rất dễ sử dụng.

  1. Các hàm này đã được tối ưu hóa hiệu suất

Vì chúng là những hàm thư viện chuẩn, do đó, một nhóm các developer sẽ liên tục cải tiến chúng để có được phiên bản tốt nhất. Trong quá trình cải tiến, họ có thể tạo ra những mã hiệu quả nhất để tối ưu hóa hiệu suất.

  1. Giúp tiết kiệm thời gian

Các hàm tổng quát như in ra màn hình, tính căn bậc 2,… đều đã được viết sẵn. Do đó, bạn không cần phải lo lắng về việc viết lại chúng một lần nữa.

  1. Các hàm rất linh động

Mọi thứ luôn thay đổi từng ngày và ứng dụng của bạn cũng phải hoạt động mọi lúc mọi nơi. Do đó, các hàm thư viện sẽ giúp bạn có thể thực hiện một nhiệm vụ ở nhiều máy tính khác nhau.

Ví dụ: sử dụng hàm sqrt () để tính căn bậc 2

Giả sử bạn muốn tìm căn bậc 2 của một số.

Để có thể tính được căn bậc 2 của một số, bạn có thể sử dụng hàm thư viện sqrt(). Hàm này được xác định trong tệp tiêu đề math.h

#include <stdio.h>

#include <math.h>

int main()

{

float num, root;

printf(“Enter a number: “);

scanf(“%f”, &num);

// Computes the square root of num and stores in root.

root = sqrt(num);

printf(“Square root of %.2f = %.2f”, num, root);

return 0;

}

Khi bạn chạy lập trình này, đầu ra sẽ là

Enter a number: 12

Square root of 12.00 = 3.46

Các hàm thư viện trong các tệp tiêu đề khác

Các tệp tiêu đề trong lập trình C
<assert.h> Các hàm xác nhận lập trình
<ctype.h> Các hàm kiểu ký tự
<locale.h> Các hàm có chức năng bản địa hóa
<math.h> Các hàm toán học
<setjmp.h> Các hàm chứa lệnh nhảy
<signal.h> Các hàm xử lý tín hiệu
<stdarg.h> Các hàm xử lý đối số của biến
<stdio.h> Các hàm luồng vào ra tiêu chuẩn
<stdlib.h> Các hàm số hiệu dụng tiêu chuẩn
<string.h> Các hàm xử lý chuỗi
<time.h> Các hàm ngày giờ

 

Bài viết Đọc ghi File trong C – Thao tác làm việc với File trong C chi tiết đã xuất hiện đầu tiên vào ngày Iron Hack Việt Nam.



source https://ironhackvietnam.edu.vn/cac-loai-tep-c/

Nhận xét

Bài đăng phổ biến từ blog này

Biểu thức, Lệnh, Khối trong C# – Expression, Statement và Block in C#

Chi tiết về biến con trỏ (pointer) trong C từ A-Z