Tệp nhị phân c. Cách mở tệp nhị phân

Mô tả và xem nội bộ của các tập tin

Tập tin khác nhau. Tất cả các tệp được lưu trữ trong máy tính có thuộc tính đặc biệt, tức là. Các phương thức mô tả đặc biệt cho phép bạn phân biệt một tệp với tên khác: 1) Tên; kích thước 2; 3) Ngày và giờ; 4) Biểu tượng.

Mỗi tệp có tên - tên tệp. Tên tệp mô tả nội dung của nó hoặc gợi ý những gì nó có thể được sử dụng. Tên được gán cho tệp khi nó được tạo. Điều này áp dụng cho tất cả các tệp.

Mỗi tập tin có kích thước vật lý. Tệp lấy một số lượng bộ nhớ máy tính và một số dung lượng đĩa.

Tại thời điểm tạo một tệp, hệ điều hành sẽ đưa in với ngày và giờ sáng tạo. Điều này cho phép bạn sắp xếp các tệp theo ngày và thời gian và do đó gây ra lệnh trong máy tính. Cũng đánh dấu ngày và thời gian cập nhật hoặc thay đổi tập tin.

Mỗi tệp liên quan đến một loại cụ thể, liên quan chặt chẽ với biểu tượng tệp mà chúng ta thấy. Loại tệp phụ thuộc vào nội dung của nó. Mỗi chương trình gán một loại cụ thể và biểu tượng tương ứng được tạo bởi tài liệu đã tạo.

Kích thước tệp được đo bằng byte, cũng như dung lượng bộ nhớ.

Kích thước tệp có thể là 0 byte, có nghĩa là tệp tồn tại, nhưng nó không chứa bất cứ thứ gì. S Kích thước tệp tối đa - 4 GB. Nhưng những tập tin lớn như vậy là rất hiếm.

Cụ thể, đồng hồ máy tính tích hợp, đặc biệt là để chỉ định các tệp thời gian và ngày sáng tạo của chúng. Điều này giải thích tầm quan trọng của nó để cấu hình đúng đồng hồ này. Ngoài ra còn có các thuộc tính bổ sung để mô tả các tệp, chẳng hạn như tệp hệ thống, tệp ẩn, tệp chỉ đọc, tệp lưu trữ, v.v. Hệ điều hành sẽ hiểu điều này.

Mỗi tệp có một chỉ mục duy nhất. Chỉ số chứa thông tin cần thiết cho bất kỳ quy trình nào để tham khảo tệp. Các quy trình tham khảo các tệp bằng cách sử dụng một tập hợp các cuộc gọi hệ thống được xác định rõ ràng và xác định tệp chuỗi tệp hoạt động như một tên tệp tổng hợp. Mỗi tên composite rõ ràng xác định tệp, để nhân hệ thống chuyển đổi tên này thành chỉ mục tệp. Chỉ mục bao gồm một bảng vị trí địa chỉ của thông tin tệp trên đĩa. Vì mỗi khối trên đĩa được gửi đến số của nó, bảng này lưu trữ bộ số khối đĩa. Để tăng tính linh hoạt, kernel gắn vào một khối tệp từng khối, cho phép thông tin tệp được phân tán trên toàn bộ hệ thống tệp. Nhưng sơ đồ vị trí này làm phức tạp tác vụ tìm kiếm dữ liệu. Tuy nhiên, bảng Địa chỉ chứa danh sách các số khối chứa tệp thuộc sở hữu của tệp, tuy nhiên, các tính toán đơn giản cho thấy danh sách các khối tệp tuyến tính trong chỉ mục rất khó kiểm soát. Để cấu trúc nhỏ của chỉ mục hoạt động với các tệp lớn, bảng địa chỉ khối đĩa được đưa vào dòng với cấu trúc.

Tệp văn bản và nhị phân

Các tệp cho phép người dùng đọc một lượng lớn dữ liệu trực tiếp từ đĩa mà không cần nhập chúng từ bàn phím. Có hai loại tệp chính: văn bản và nhị phân.

Bản vănĐược gọi là tập tin bao gồm bất kỳ ký tự. Chúng được tổ chức bởi các dòng, mỗi dòng kết thúc bằng biểu tượng dòng cuối ". Phần cuối của tệp được chỉ định bởi biểu tượng " nhập tệp ». Khi viết thông tin trong tệp văn bản, bạn có thể xem bạn có thể sử dụng bất kỳ trình soạn thảo văn bản nào, tất cả dữ liệu được chuyển đổi thành loại ký tự và được lưu trữ ở dạng tượng trưng.

Trong nhị phân. hòxcác tập tin Thông tin được đọc và ghi ở dạng khối có kích thước nhất định trong đó dữ liệu có thể được lưu trữ cho bất kỳ loại và cấu trúc nào.

Các loại dữ liệu đặc biệt được sử dụng để làm việc với các tệp, được gọi là chủ đề.IfStream Flow để hoạt động với các tệp ở chế độ đọc và ifstream ở chế độ ghi. Để làm việc với các tệp trong chế độ, cả bản ghi và đọc là luồng ifstream.

Trong các chương trình C ++ khi làm việc với các tệp văn bản, bạn cần kết nối các bộ phim thư viện và iOStream.

Để ghi dữ liệu trong tệp văn bản, cần thiết: 1) Mô tả biến loại của dòng chảy. mở.Được; 3) Rút thông tin vào một tệp; 4) Hãy chắc chắn để đóng tập tin.

Để đọc dữ liệu từ một tệp văn bản, bạn phải:

1) Mô tả biến loại ifstream.Được; 2) Mở tệp bằng chức năng mở.Được; 3) Đọc thông tin từ tệp, khi đọc từng phần dữ liệu, cần kiểm tra xem phần cuối của tệp sẽ đạt được liệu; 4) Đóng tập tin.

Cần lưu ý rằng trong tất cả các ví dụ được thảo luận ở trên hàm fopen () trong các chế độ "R" và W "sẽ mở một tệp văn bản để đọc và viết, tương ứng. Điều này có nghĩa là một số ký hiệu định dạng văn bản, chẳng hạn như vận chuyển trở về '\\ r', không thể được đọc dưới dạng các ký tự riêng lẻ, chúng, bất kể nó tồn tại trong tệp như thế nào, nhưng chúng đang ở đó. Đây là một tính năng của chế độ chế độ văn bản. Để biết thêm "tốt" hoạt động với nội dung tệp, có chế độ nhị phân biểu thị nội dung của tệp dưới dạng chuỗi byte, trong đó tất cả các mã kiểm soát có thể chỉ đơn giản là số. Nó nằm trong chế độ này có thể xóa hoặc thêm các ký tự điều khiển không thể truy cập ở chế độ văn bản. Để mở tệp ở chế độ nhị phân, hàm fopen () cũng được sử dụng với tham số cuối cùng bằng "RB" và "WB" tương ứng để đọc và viết.

Các tập tin. Đồng thời, từ quan điểm thực hiện kỹ thuật ở cấp độ phần cứng, tệp văn bản là trường hợp riêng tư tệp nhị phân, và do đó, theo giá trị rộng của từ, bất kỳ tệp nào phù hợp với định nghĩa của "nhị phân tập tin".

Nói chung, thuật ngữ này là thước đo mối quan hệ của người tiêu dùng của tệp nhị phân và tệp chính nó. Nếu người tiêu dùng biết cấu trúc và quy tắc mà nó có thể chuyển đổi tệp này thành mức cao hơn, thì đó không phải là nhị phân cho anh ta. Ví dụ: các tệp thực thi là nhị phân cho người dùng máy tính, nhưng không phải là những tệp cho hệ điều hành. [ ]

Hình dung

Để trình bày trực quan của tệp nhị phân, nó được chia thành các phần có kích thước bằng nhau, được biểu thị dưới dạng các số được ghi lại, thông thường, trong một hệ thống thập lục phân, đôi khi trong một Octic, Binary hoặc Decimal. Kích thước nghĩa của mảnh có thể bằng một octet, cũng như hai hoặc bốn (trong trường hợp tách thành miếng, một số octet sử dụng thứ tự byte được sử dụng trên nền tảng được sử dụng). Sự phụ thuộc của phạm vi của các số đại diện từ kích thước của mảnh được hiển thị trong bảng:

Ocetov. Số bit Hexadecimal. Octal. số thập phân.
Không suy nghĩ
số thập phân.
iconic.
1 8 00

Ff.
000

377
0

255
-128

127
2 16 0000

Ffff.
000000

177777
0

65535
-32768

32767
4 32 00000000

Ffffffff.
00000000000

37777777777
0

4294967295
-2147483648

2147483647

Thông thường, ngoài các giá trị số của byte, các ký hiệu của trang mã cũng được hiển thị, chẳng hạn như ASCII. Ví dụ sau đây cho thấy T.n. Đổ cổ điển (Một biểu tượng thập phân khéo léo gồm 16 byte liên tiếp, với các biểu tượng ASCII được in ở bên phải) Phần đầu của tệp PNG của logo Wikipedia:

0000000000 89 50 4E 47 0D 0A 1A 0A 00 00 00 00 0D 49 48 44 52 | .png ........ IHDR | 0000000010 00 00 00 00 00 00 00 00 00 A0 08 03 00 00 11 90 8 8F | ................ | 00000020 B6 00 00 00 04 67 41 4D 41 00 00 D6 D8 D4 4F 58 | ..... GAMA ..... OX | 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 | 2 .... TextSoftwar | 00000040 65 00 41 64 62 62 65 20 49 6D 61 67 65 52 65 61 | e.Adobe Imagerea | 00000050 64 79 71 C9 65 3C 00 00 03 00 50 4C 54 45 22 22 | dyq.e<....PLTE""| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |"VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |[Email được bảo vệ]@@ ... OOO,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>\u003e\u003e: 99 ...... 55 | 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0D 0D 0D | 5QPP777 ... %%% ... | 000000A0 27 27 27 1A 1A 1A 38 38 38 2A 2A 2A 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 888 ** 888 ** ... | 000000B0 20 20 17 17 17 2E 2E 2E 13 13 13 BB BB BB 88 88 |... ............ |.

Dụng cụ

Để trực quan hóa

  • gỡ lỗi (trong Microsoft Windows, một phần)
  • hexdump (trong FreeBSD, GNU / Linux, v.v.)

Chỉnh sửa

  • Hex Editor.
    • beye (đối với tất cả các hệ điều hành, chương trình miễn phí)
    • hiew (đối với DOS, Microsoft Windows, Windows NT)
    • WINHEX (Dành cho Windows)

Tags: Tệp nhị phân, fseek, ftell, fpos, fread, fwrite

Tệp nhị phân.

T eksty tập tin được lưu trữ dữ liệu dưới dạng văn bản (sic!). Điều này có nghĩa là nếu, ví dụ, chúng tôi ghi lại một số nguyên 12345678 vào một tệp, thì 8 ký tự được viết và đây là 8 byte dữ liệu, mặc dù thực tế là số được đặt trong toàn bộ loại. Ngoài ra, đầu ra và nhập dữ liệu được định dạng, nghĩa là, mỗi lần chúng ta đọc số từ tệp hoặc ghi vào tệp, chuyển đổi số trong chuỗi hoặc back được chuyển đổi. Đây là những hoạt động tốn kém có thể tránh được.

Tệp văn bản cho phép bạn lưu trữ thông tin dưới dạng dễ hiểu với con người. Tuy nhiên, bạn có thể lưu trữ dữ liệu trực tiếp ở dạng nhị phân. Đối với các mục đích này, các tệp nhị phân được sử dụng.

#Include. #Include. #Include. #Define error_file_open -3 void main () (file * output \u003d null; int số; đầu ra \u003d fopen ("d: /c/output.bin", "wb"); ifput \u003d\u003d null) (Printf ("Lỗi mở Tệp "); getch (); exit (error_file_open);) scanf ("% d ", & số); fwrite (& số, sizeof (int), 1, đầu ra); fclose (đầu ra); _getch ();)

Chạy chương trình và kiểm tra nội dung của tệp đầu ra.bin. Số đã nhập người dùng được ghi vào tệp trực tiếp ở dạng nhị phân. Bạn có thể mở tệp trong bất kỳ trình soạn thảo nào hỗ trợ bản trình bày trong thập lục phân (Tổng chỉ huy, xa) và đảm bảo rằng.

Mục nhập tệp được thực hiện bằng cách sử dụng chức năng.

Size_t fwrite (const void * ptr, size_t size, size_t đếm, tập tin * luồng);

Hàm trả về số lượng các mục được ghi lại tốt. Là đối số, con trỏ được đưa đến một mảng, kích thước của một phần tử, số phần tử và con trỏ vào luồng tệp. Thay vì một mảng, tất nhiên, bất kỳ đối tượng có thể được truyền đi.

Mục nhập vào tệp nhị phân của đối tượng tương tự như màn hình của nó: dữ liệu được lấy từ RAM và được viết như nó là. Chức năng Fread được sử dụng để đọc

Size_t fread (void * ptr, kích thước size_t, size_t đếm, tập tin * luồng);

Hàm trả về số lượng các mục đọc thành công được đặt tại PTR. Tổng số các yếu tố theo kích thước byte được đọc. Bây giờ chúng ta hãy xem xét số của chúng tôi trở lại với biến.

#Include. #Include. #Include. #Define error_file_open -3 void main () (file * input \u003d null; int số; nhập \u003d fopen ("d: /c/output.bin", "rb"); if (inputing \u003d\u003d null) (" Lỗi mở tệp "); getch (); exit (error_file_open);) fread (& số, sizeof (int), 1, đầu vào); printf ("% d ", số); fclose (đầu vào); )

fseek.

Một trong những chức năng quan trọng để làm việc với các tệp nhị phân là chức năng fseek

Int fseek (tập tin * luồng, infset dài, int gốc);

Tính năng này đặt con trỏ vị trí được liên kết với luồng đến một vị trí mới. Chỉ báo vị trí cho biết nơi chúng ta dừng trong tệp. Khi chúng tôi mở tệp, vị trí bằng 0. Mỗi lần, ghi lại byte dữ liệu, con trỏ vị trí dịch chuyển trên mỗi đơn vị về phía trước.
FSEEK coi là đối số một con trỏ để truyền phát và thay đổi các byte offset so với nguồn gốc. Nguồn gốc có thể mất ba ý nghĩa

  • Seek_set. - Bắt đầu tập tin
  • Seek_cur. - Vị trí hiện tại của tập tin
  • Seek_end. - Kết thúc tập tin. Thật không may, tiêu chuẩn không xác định phần cuối của tệp là gì, vì vậy không thể dựa vào chức năng này.

Trong trường hợp hoạt động thành công, hàm trả về 0.

Ví dụ điển hình của chúng tôi: Chúng tôi viết một số, sau đó di chuyển con trỏ đến đầu tệp và đọc nó.

#Include. #Include. #Include. #Define error_file_Open -3 void main () (file * iofile \u003d null; int số; iofile \u003d fopen ("d: /c/output.bin", "w + b"); if (iofile \u003d\u003d null) (printf ("Lỗi mở tệp"); getch (); exit (error_file_open);) scanf ("% d", & số); fwrite (& số, sizeof (int), 1, iofile); fseek (iofile, 0, Seek_set); số \u003d 0; fread (& số, sizeof (int), 1, iofile); printf ("% d", số); fclose (iofile); _getch ();)

Thay vào đó, bạn cũng có thể sử dụng chức năng tua lại, di chuyển chỉ báo vị trí sang đầu.

Một loại fpos_t đặc biệt được định nghĩa trong C, được sử dụng để lưu trữ vị trí chỉ báo vị trí trong tệp.
Chức năng

Int fgetpos (tập tin * luồng, fpos_t * pos);

Được sử dụng để gán biến POS Vị trí hiện tại. Chức năng

Int fsetpos (tập tin * luồng, const fpos_t * pos);

Được sử dụng để chuyển một con trỏ đến một vị trí được lưu trữ trong biến POS. Cả hai chức năng trong trường hợp hoàn thành thành công trả về 0.

Long int ftell (tập tin * luồng);

trả về vị trí hiện tại của chỉ báo liên quan đến sự bắt đầu của tệp. Đối với các tệp nhị phân, đây là số byte, đối với các văn bản không được xác định (nếu tệp văn bản bao gồm các ký tự một byte, thì số lượng byte).

Hãy xem xét một ví dụ: Người dùng nhập số. 4 byte đầu tiên của tệp: một số nguyên có nghĩa là có bao nhiêu số được giới thiệu. Sau khi người dùng dừng nhập số, chúng ta di chuyển đến đầu tệp và viết số phần tử đã nhập ở đó.

#Include. #Include. #Include. #Define error_open_file -3 void main () (file * iofile \u003d null; unsign buister \u003d 0; int num; int yn; iofile \u003d fopen ("d: /c/c/c/c/c/c/c/c/c.bin", "w + b"); nếu (IOFILE \u003d\u003d NULL) (tệp mở ("Lỗi Lỗi"); getch (); exit (error_open_file);) fwrite (& counter, sizeOf (int), 1, iofile); do (printf ("Nhập số mới? "); scanf ("% d ", & yn); if (yn \u003d\u003d 1) (scanf ("% d ", & num); fwrite (& num, sizeof (int), 1, iofile); +;) Khác (tuatedd (iofile); fwrite (& truy cập, sizeof (int), 1, iofile); phá vỡ;)) trong khi (1); fclose (iofile); getch ();)

Chương trình thứ hai đầu tiên đọc số lượng số được ghi, sau đó đọc và hiển thị các số theo thứ tự.

#Include. #Include. #Include. #Define error_open_file -3 void main () (file * iofile \u003d null; unsign unter; int i, num; iofile \u003d fopen ("d: /c/c/c/c/c/c/c/c/c/c.bin", "RB"); ifile \u003d\u003d null ) (In printf ("Lỗi mở tệp"); getch (); exit (error_open_file);) fread (& counter, sizeof (int), 1, iofile); cho (i \u003d 0; i< counter; i++) { fread(&num, sizeof(int), 1, iofile); printf("%d\n", num); } fclose(iofile); getch(); }

Ví dụ

1. Có một tệp nhị phân có kích thước 10 * sizeof (int) byte. Người dùng nhập số ô, sau đó số được ghi vào nó. Sau mỗi thao tác, tất cả các số được hiển thị. Đầu tiên, hãy thử mở tệp ở chế độ đọc và ghi. Nếu không thể, chúng tôi cố gắng tạo một tệp nếu bạn quản lý để tạo một tệp, thì chúng tôi lặp lại nỗ lực để mở một tệp để đọc và viết.

#Include. #Include. #Include. #Define size 10 void main () (const char filename \u003d "D: / c / state"; file * bfile \u003d null; int pos; int giá trị \u003d 0; in in i; char (wascreated \u003d 0; bfile \u003d Fopen (tên tệp, "r + b"); if (null \u003d\u003d bfile) (printf ("thử tạo tệp ... \\ n"); getch (); bfile \u003d fopen (tên tệp, "wb"); nếu (Bfile \u003d\u003d null) (Printf ("Lỗi khi tạo tệp"); getch (); thoát (1);) cho (i \u003d 0; i< SIZE; i++) { fwrite(&value, sizeof(int), 1, bfile); } printf("File created successfully...\n"); fclose(bfile); wasCreated = 1; } } while(wasCreated); do { printf("Enter position "); scanf("%d", &pos); if (pos < 0 || pos >\u003d Kích thước) (ngắt;) printf ("Nhập giá trị" (! Lang :); Scanf ("%d", &value); fseek(bfile, pos*sizeof(int), SEEK_SET); fwrite(&value, sizeof(int), 1, bfile); rewind(bfile); for (i = 0; i !}< SIZE; i++) { fread(&value, sizeof(int), 1, bfile); printf("%d ", value); } printf("\n"); } while(1); fclose(bfile); }

2. Chúng tôi viết từ vào một tệp nhị phân. Định dạng là như vậy - đầu tiên số lượng chữ cái, sau đó từ đó không có ký hiệu bằng không. Họ đã ăn chiều dài của từ bằng 0, sau đó không có từ nào. Đầu tiên, yêu cầu các từ từ người dùng, sau đó đọc lại.

#Include. #Include. #Include. #Include. #Define error_file_open -3 void main () (const char filename \u003d "c: /c/words.bin"; const strierword \u003d "exit"; unsign int len; file * wordsfile \u003d null ("Mở tệp ... \\ n "); Wordsfile \u003d fopen (tên tệp," w + b "); if (wordsfile \u003d\u003d null) (printf (" lỗi mở lỗi "); getch (); exit (error_file_open);) printf ( "Nhập từ \\ n"); do (scanf ("% 127s", bộ đệm); if (strcmp (bộ đệm, termword) \u003d\u003d 0) (len \u003d 0; fwrite (& len, sizeOf (không dấu), 1, WordsFile ); Break;) len \u003d strlen (bộ đệm); fwrite (& len, sizef); fwrite (bộ đệm, 1, len, wordsfile);) trong khi (1); presf ("tua lại và đọc từ \\ n") ; Tua lại (wordsfile); getch (); do (fread (& len, sizeof (int), 1, wordsfile); if (len \u003d\u003d 0) (break;) fread (bộ đệm, 1, len, bộ đệm \u003d "\\ 0"; printf ("% s \\ n", bộ đệm);) trong khi (1); fclose (wordsfile); getch ();)

3. Nhiệm vụ - Đọc dữ liệu từ tệp văn bản và viết chúng vào nhị phân. Để giải quyết bài kiểm tra, chúng ta sẽ tạo một hàm của trình bao bọc. Nó sẽ chấp nhận tên tệp, chế độ truy cập, chức năng bạn muốn thực thi nếu tệp đã được mở thành công và các đối số của hàm này. Vì các đối số có thể rất nhiều và chúng có thể có nhiều loại khác nhau, sau đó chúng có thể được truyền dưới dạng con trỏ đến cấu trúc. Sau khi thực hiện chức năng, tệp sẽ đóng lại. Do đó, không cần phải nghĩ về việc phát hành tài nguyên.

#Include. #Include. #Include. #Define Debug #ifdef gỡ lỗi #define gỡ lỗi (dữ liệu) printf ("% s", dữ liệu); #Else #define gỡ lỗi (dữ liệu) #endif const char inputfile \u003d "d: /c/xinput.txt"; Const char outputfile \u003d "D: /c/output.bin"; Cấu trúc Somears (int * mục; số size_t;); Int writetofile (tệp * tệp, void * args) (size_t i; size somearss * data \u003d (stepsearss *) args; gỡ lỗi ("ghi vào fwrite \\ n") fwrite (dữ liệu-\u003e mục, sizeof (int), dữ liệu -\u003e Số, tệp); Gỡ lỗi (Viết Viết đã hoàn tất \\ n ") Trả về 0;) Int ReadandCallback (tệp * args) (args) (cấu trúc dữ liệu Somearss; kích thước size_t, i \u003d 0; int rence; Gỡ lỗi từ fscanf fscanf (tệp, "% d", và kích thước); data.items \u003d (int *) malloc (kích thước * sizeOf (int)); data.number \u003d size; while (! feof (file) ) (Fscanaf (tệp, "% d", & data.items [i]); i ++;) Debug ("Gọi WithOpenfile \\ n") \u003d withOpenFile (OutputFile, "W", Writetofile và dữ liệu); Gỡ lỗi ("đọc kết thúc \\ n") miễn phí (data.items); kết quả trả về;) int dostuff () (return withOpenfile () (inputfile, r ", readandcallback, null);) // wrapper - hàm sẽ mở tệp . Nếu tệp đã được mở một cách an toàn, // thì chức năng thú vị được gọi. Vì các đối số có thể rất khác nhau, // sau đó chúng được truyền qua nút xoay *. Như một loại đối số // sử dụng khả năng sử dụng cấu trúc int int withopenfile (tên tệp const char *, chế độ const char *, int (* vui vẻ), void * args) (file * file \u003d fopen (tên tệp, chế độ); DEBUG ("Cố gắng mở tệp") gỡ lỗi (tên tệp) Debug ("\\ n") if (file! \u003d null) (err \u003d fun (file, args);) other (return 1;) gỡ lỗi ("Đóng tệp" ) Gỡ lỗi (tên tệp) gỡ lỗi ("\\ n") fclose (file); return err;) void main () (printf ("kết quả \u003d% d", dostuff ()); getch ();)

4. Tính năng SaveInT32Array cho phép bạn lưu một mảng loại int32_t vào một tệp. Loadint32Array nghịch đảo đọc lại mảng. Tính năng LOADINT32Array lần đầu tiên khởi tạo mảng được truyền đạt đến nó, vì vậy chúng ta phải truyền con trỏ đến con trỏ; Ngoài ra, nó ghi lại kích thước mảng kết quả đến tham số kích thước được truyền, đó là lý do tại sao nó được truyền dưới dạng con trỏ.

#Include. #Include. #Include. #Include. #Define size 100 int sideInt32Array (const char * filename, const int32_t * a, size_t size) (tên tệp, "wb"); nếu (! Out) (trả về 0;) // ghi độ dài của mảng fwrite (& kích thước , sizeOf (size_t), 1, out); // ghi toàn bộ mảng fwrite (a, sizef (int32_t), kích thước, ra); fclose (out); trả về 1;) int loadint32array (const char * filename, int32_t * * A, size_t * size) (file * in \u003d fopen (tên tệp, "rb"); if (! In) (trả về 0;) // đọc độ dài của mảng fread (kích thước, sizeOf (size_t), 1, trong); // khởi tạo mảng (* a) \u003d (int32_t *) malloc (sizeOf (int32_t) * (* kích thước)); if (! (! (* a)) (trả về 0;) // đọc toàn bộ mảng fread ((* A), sizeOf (int32_t), * size, in); fclose (in); return 1;) void main () (const char * tmpfilename \u003d "tmp.bin"; int32_t exout; int32_t * exin \u003d null ; size_t realsize; int i; cho (i \u003d 0; i< SIZE; i++) { exOut[i] = i*i; } saveInt32Array(tmpFilename, exOut, SIZE); loadInt32Array(tmpFilename, &exIn, &realSize); for (i = 0; i < realSize; i++) { printf("%d ", exIn[i]); } _getch(); }

5. Tạo một bảng tìm kiếm. Để tăng tốc chương trình, thay vì tính toán chức năng, trước tiên bạn có thể tính toán các giá trị của hàm trên khoảng với độ chính xác nhất định, sau đó các giá trị đã từ bảng. Chương trình đầu tiên thực hiện trình duyệt hóa chức năng với các tham số được chỉ định và lưu nó vào tệp, sau đó tải mảng được bầu trước, đã được sử dụng để xác định các giá trị. Trong chương trình này, tất cả các chức năng trả về một biến của loại kết quả, lưu trữ số lỗi. Nếu chức năng đã hoạt động mà không gặp sự cố, nó sẽ trả về OK (0).

#Define _crt_secure_no_warnings // Có, giờ đây nó chắc chắn để thêm, nếu không nó không hoạt động #include #Include. #Include. #Include. #Include. // mỗi hàm trả về kết quả. Nếu nó bằng OK, thì hàm // đã hoạt động mà không gặp sự cố của kết quả typedef int; // Kết quả có thể #Define OK 0 #define error_pening_file 1 #define error_out_of_memory 2 // Chức năng mà chúng ta sẽ nhận được Double Mysinus (Return Sin (X);) Kết quả bị tắc nghẽn (const char * tên tệp, gấp đôi từ, kép, Gấp đôi (* f) (kép)) (kết quả r; file * out \u003d fopen (tên tệp, "wb"); giá trị kép; nếu (! Out) (r \u003d error_pening_file; goto exit;) fwrite ( Từ), 1, out); fwrite (& to, sizeof (đến), 1, out); fwrite (& bước, sizeof (bước), 1, out); cho (từ; từ; từ; từ< to; from += step) { value = f(from); fwrite(&value, sizeof(double), 1, out); } r = Ok; EXIT: fclose(out); return r; } Result loadFunction(const char *filename, double **a, double *from, double *to, double *step) { Result r; uintptr_t size; FILE *in = fopen(filename, "rb"); if (!in) { r = ERROR_OPENING_FILE; goto EXIT; } //Считываем вспомогательную информацию fread(from, sizeof(*from), 1, in); fread(to, sizeof(*to), 1, in); fread(step, sizeof(*step), 1, in); //Инициализируем массив size = (uintptr_t) ((*to - *from) / *step); (*a) = (double*) malloc(sizeof(double)* size); if (!(*a)) { r = ERROR_OUT_OF_MEMORY; goto EXIT; } //Считываем весь массив fread((*a), sizeof(double), size, in); r = Ok; EXIT: fclose(in); return r; } void main() { const char *tmpFilename = "tmp.bin"; Result r; double *exIn = NULL; int accuracy, option; double from, to, step, arg; uintptr_t index; //Запрашиваем параметры для создания таблицы поиска printf("Enter parameters\nfrom = "); scanf("%lf", &from); printf("to = "); scanf("%lf", &to); printf("step = "); scanf("%lf", &step); r = tabFunction(tmpFilename, from, to, step, mySinus); if (r != Ok) { goto CATCH_SAVE_FUNCTION; } //Обратите внимание на формат вывода. Точность определяется //во время работы программы. Формат * подставит значение точности, //взяв его из списка аргументов accuracy = (int) (-log10(step)); printf("function tabulated from %.*lf to %.*lf with accuracy %.*lf\n", accuracy, from, accuracy, to, accuracy, step); r = loadFunction(tmpFilename, &exIn, &from, &to, &step); if (r != Ok) { goto CATCH_LOAD_FUNCTION; } accuracy = (int)(-log10(step)); do { printf("1 to enter values, 0 to exit: "); scanf("%d", &option); if (option == 0) { break; } else if (option != 1) { continue; } printf("Enter value from %.*lf to %.*lf: ", accuracy, from, accuracy, to); scanf("%lf", &arg); if (arg < from || arg > đến) (printf ("giá trị xấu \\ n"); tiếp tục;) index \u003d (uintptr_t) ((arg - từ) / bước); Printf ("đã lưu%. * Lf \\ ncompented%. * Lf \\ n", độ chính xác, exin, độ chính xác, mysinus (arg)); ) Trong khi (1); R \u003d ok; Lối ra goto; Catch_save_fulation: (Printf ("Lỗi trong khi tiết kiệm giá trị"); GOTO EXIT;) Catch_load_function: (Printf Lỗi trong khi tải giá trị "); GOTO EXIT;) Thoát: Miễn phí (exin); _Getch (); Thoát (r); )

6. Chúng tôi có hai cấu trúc. Cửa hàng Personkey đầu tiên Đăng nhập, Mật khẩu, ID người dùng và trường Offset. Cấu trúc thứ hai của PersonInfo lưu trữ tên và họ của người dùng và tuổi của nó. Các cấu trúc đầu tiên được ghi vào tệp nhị phân Key.bin, cấu trúc thứ hai trong các giá trị tệp nhị phân .bin. Trường Offset xác định vị trí của thông tin người dùng có liên quan trong tệp thứ hai. Do đó, đã nhận được PersonKey từ tệp đầu tiên, trường Offset có thể bị xóa khỏi tệp thứ hai được liên kết với thông tin khóa này.

Tại sao làm điều đó? Điều này có lợi nếu cấu trúc của PersonInfo có kích thước lớn. Xóa mảng các cấu trúc nhỏ khỏi tệp không bắt buộc và khi chúng ta cần một cấu trúc lớn, nó có thể được lấy bởi địa chỉ trong tệp.

#Define _crt_secure_no_warnings #include. #Include. #Include. #Include. Typedef struct personkey (ID dài; đăng nhập char; mật khẩu char; offset dài; // vị trí của các giá trị personinfo tương ứng) cá nhân; Typedef struct personinfo (tuổi không dấu; char firstname; char lastName;) personInfo; / * Chức năng yêu cầu người dùng từ người dùng và viết chúng liên tiếp trong hai tệp * / void creativeonperson (tĩnh ID dài \u003d 0; Personkey PKEY; Personfo Pinfo; PKey.id \u003d id ++; // Làm thế nào tất cả mọi người Các giá trị được ghi trong nhau, vị trí hiện tại // con trỏ trong tệp thứ hai sẽ là một vị trí cho PKEY.OFFSET \u003d FTELL RECORD (giá trị); Printf ("Đăng nhập:"); Scanf ("% 63s" , PKEY.LOGIN); Printf ("Mật khẩu:"); Scanf ("% 63s", PKEY.PASSWORD); Printf ("Tuổi:"); Scanf ("% d", & (Pinfo.age)); Printf ("Tên đầu tiên:"); scanf ("% 63s", Pinfo.firstname); Printf ("Họ:"); scanf ("% 127s", pinfo.lastname); fwrite (& PKEY, sizeof (PKEY) , 1, phím); fwrite (& pinfo, sizeof (pinfo), 1, giá trị);) void createpersons (phím * phím * giá trị) (bộ đệm char; int Lặp lại \u003d 1; // số của các yếu tố trong tệp // Vị trí đặt trước theo bản ghi của số fwrite (& bộ đếm, sizeof), 1, phím); printf ("tạo người \\ n"); làm (createeneperson (phím, giá trị); Printf ("\\ nyet một cái khác? "); scanf ("% 1s ", bộ đệm); bộ đếm ++; nếu (bộ đệm! \u003d" Y "&& bộ đệm! \u003d" Y ") (lặp lại \u003d 0;)) trong khi (lặp lại); // Trở về Bắt đầu và ghi số lượng các yếu tố đã tạo của tua lại (phím); fwrite (& bộ đếm, sizeof (bộ đếm), 1, phím);) / * Tạo một mảng các phím * / personkey * Readkeys (file * phím, int * size) (int i; personkey * out \u003d null; tua lại (phím); fread (kích thước, kích thước (* kích thước), 1, phím); out \u003d (personkey *) malloc (* size * sizef (out, SizeOf (personkey), * kích thước, phím); trả lại;) / * chức năng mở hai tập tin cùng một lúc. Để đơn giản hóa tác vụ, trả về mảng tệp. * / File ** openfiles (const char * allalfilename) (tệp * * File \u003d (file * *) malloc (sizeof (file *) * 2); files \u003d fopen (keysfilename, "w + b"); if w + b "); if (! Files) (trả về null;) files \u003d fopen (giá trịFileName," W + B "); if (! Files) (fclose (files); return null;) trả về tệp;) / * hai chức năng phụ trợ cho khóa và thông tin * / void printkey (Personkey PK) (In f ("% d. % s [% s] \\ n ", (int) pk.id, pk.login, pk.password);) void printInfo (informationinfo) (printf ("% d% s% s \\ n ", info.age , info.firstname, info.lastname);) / * Chức năng chính (hoặc thay vào đó, bằng trường bù của nó) kéo giá trị mong muốn từ tệp thứ hai * / personinfo readInfobypykey (PersonKey PK, File * giá trị) (PersonInfo out; tua lại ( Giá trị); fseek (giá trị, pk.offset, seek_set); fread (và ra, sizeOf (personinfo), 1, giá trị); trả về;) void getpersonsinfo (phím personkey *, int index; personfo p; Làm (Printf ("Nhập vị trí của phần tử. Để thoát In Chỉ số xấu: "); Scanf ("% d ", & Index); if (index< 0 || index >\u003d Kích thước) (printf ("chỉ số xấu"); trả lại;) p \u003d reedInfobyperseykeykey (khóa, giá trị); Printinfo (p); ) Trong khi (1); ) void main () (int size; int i; personkey * keys \u003d null; file ** files \u003d openfiles ("c: /c/key.bin", "C: /c/values.bin"); nếu ( tập tin \u003d\u003d 0) (printf ("lỗi mở tệp"); goto miễn phí;) createpersons (tập tin, tập tin); keys \u003d readkey (files, for (i \u003d 0; i< size; i++) { printKey(keys[i]); } getPersonsInfo(keys, files, size); fclose(files); fclose(files); FREE: free(files); free(keys); _getch(); }

Nhiều người thường đặt ra câu hỏi về cách mở một tập tin nhị phân. Tài liệu này là bất kỳ tệp nào trên máy tính cá nhân. Tất cả dữ liệu được đặt trên máy tính và nhà cung cấp liên quan đến nó thường được ghi vào bit. Đó là từ từ này đã xảy ra. Nếu bạn mang theo một tệp văn bản đơn giản như một so sánh, thì sẽ không có vấn đề gì với việc đọc. Để làm điều này, nó là đủ để có một trình soạn thảo thông thường trên máy tính, thậm chí một máy tính xách tay sẽ xuống. Để mở tệp nhị phân, một máy tính xách tay đơn giản không hoạt động. Và nếu chúng ta nói rằng thông tin của các tệp văn bản được mã hóa tất cả các bit tương tự, thì thông thường, khi chúng nói về việc đọc các tệp nhị phân, ngụ ý các tài liệu thực thi.

Hướng dẫn hành động

Đầu tiên, đến đĩa cứng của máy tính cá nhân, bạn phải cài đặt một công cụ phần mềm có tên HexEditor, đây là trình chỉnh sửa đơn giản cho các tệp nhị phân. Sau khi cài đặt, chương trình nên được mở bằng cách nhấp vào nút này gấp đôi chuột trên biểu tượng. Công cụ này sẽ cho phép đọc tệp nhị phân ở chế độ thực. Trong trường hợp này, bạn có thể thay đổi dữ liệu trong tệp, thêm thông tin của bạn, v.v. Để làm việc trong trình soạn thảo này và thay đổi tệp nhị phân, bạn cần có ít nhất một số kiến \u200b\u200bthức trong lĩnh vực hoạt động này.

Thứ hai, cần phải làm quen với cửa sổ chính của nó không có sự khác biệt lớn so với cửa sổ của biên tập viên thông thường. Các nút giống nhau, cùng một menu, thân tài liệu, dấu trang và chuỗi trạng thái. Bạn có thể mở tệp gửi qua tab Tệp hoặc thông qua một nút đặc biệt nằm trong chương trình. Sau đó, bạn có thể thấy một tệp thực thi sẽ xuất hiện dưới dạng số và chữ cái. Bạn không nên nhầm lẫn các biểu tượng đó mà tệp nhị phân được trình bày và những biểu tượng có trình soạn thảo thông thường. Trong trường hợp họ quyết định xóa hoặc thay đổi bất kỳ phần nào của tài liệu, nên hiểu rằng nó sẽ biến mất hoặc bất kỳ phần nào của nó sẽ thay đổi.

Thứ ba, sử dụng chương trình, bạn có thể thử thay đổi bất kỳ phần nào của tài liệu. Như đã đề cập trước đó, phần mềm hiển thị tệp trong một biểu mẫu như vậy giúp cải thiện các cách để tìm kiếm phần cần thiết của tài liệu. Ngoài ra, chương trình có một thiết lập khá linh hoạt. Với nó, bạn có thể thay đổi màn hình đồ họa của mã nhị phân, có tệp nhị phân. Trong trường hợp dữ liệu không chính xác sẽ được thực hiện trong một số phần của tệp, sau này nó có thể hoặc dừng hoàn toàn hoạt động hoặc nó sẽ không hoạt động hoàn toàn chính xác. Trong mọi trường hợp, nhập dữ liệu như vậy sẽ gây ra các thay đổi trong cả hệ điều hành và trực tiếp trong chính máy tính cá nhân.

Thứ tư, sau khi thay đổi, xóa hoặc thêm dữ liệu nhất định trong tệp, giữ kết quả của công việc của nó. Trong trường hợp không có đủ kinh nghiệm trong các tệp chỉnh sửa, bạn sẽ sẵn sàng cho những hậu quả không hoàn toàn dễ chịu. Ví dụ: tài liệu có thể ngừng hoạt động sau khi thay đổi dữ liệu. Cho đến khi bạn bắt đầu hiểu rõ về vấn đề này, rất nhiều bản sao của các tệp sẽ bị hư hỏng. Nếu bạn không chắc chắn về khả năng của mình, nó không đáng để thay đổi dữ liệu của riêng bạn, đặc biệt là trong các tình huống đó cần có tệp nhị phân Binary SU.

Các tập tin. Đồng thời, từ quan điểm thực hiện kỹ thuật ở cấp độ phần cứng, tệp văn bản là trường hợp riêng tư tệp nhị phân, và do đó, theo giá trị rộng của từ, bất kỳ tệp nào phù hợp với định nghĩa của "nhị phân tập tin".

Thông thường các tệp nhị phân gọi các tệp thực thi và dữ liệu nén, nhưng không chính xác để giới hạn khái niệm này.

Hình dung

Để trình bày trực quan của tệp nhị phân, nó được chia thành các phần có kích thước bằng nhau, được biểu thị dưới dạng các số được ghi lại, thông thường, trong một hệ thống thập lục phân, đôi khi trong một Octic, Binary hoặc Decimal. Kích thước nghĩa của mảnh có thể bằng một octet, cũng như hai hoặc bốn (trong trường hợp tách thành miếng, một số octet sử dụng thứ tự byte được sử dụng trên nền tảng được sử dụng). Sự phụ thuộc của phạm vi của các số đại diện từ kích thước của mảnh được hiển thị trong bảng:

Ocetov. Số bit Hexadecimal. Octal. số thập phân.
Không suy nghĩ
số thập phân.
iconic.
1 8 00

Ff.
000

377
0

255
-128

127
2 16 0000

Ffff.
000000

177777
0

65535
-32768

32767
4 32 00000000

Ffffffff.
00000000000

37777777777
0

4294967295
-2147483648

2147483647

Thông thường, ngoài các giá trị số của byte, cùng các ký hiệu của trang mã được hiển thị, chẳng hạn như in các ký tự ASCII ở bên phải) của phần đầu của tệp PNG Wikipedia Logo:

0000000000 89 50 4E 47 0D 0A 1A 0A 00 00 00 00 0D 49 48 44 52 | .png ........ IHDR | 0000000010 00 00 00 00 00 00 00 00 00 A0 08 03 00 00 11 90 8 8F | ................ | 00000020 B6 00 00 00 04 67 41 4D 41 00 00 D6 D8 D4 4F 58 | ..... GAMA ..... OX | 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 | 2 .... TextSoftwar | 00000040 65 00 41 64 62 62 65 20 49 6D 61 67 65 52 65 61 | e.Adobe Imagerea | 00000050 64 79 71 C9 65 3C 00 00 03 00 50 4C 54 45 22 22 | dyq.e<....PLTE""| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |"VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |[Email được bảo vệ]@@ ... OOO,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>\u003e\u003e: 99 ...... 55 | 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0D 0D 0D | 5QPP777 ... %%% ... | 000000A0 27 27 27 1A 1A 1A 38 38 38 3A 2A 2A 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 ... 888 *** ... | 000000B0 20 20 17 17 17 2E 2E 2E 13 13 13 BB BB 88 88 | .............. |.

Dụng cụ

Để trực quan hóa

  • gỡ lỗi (trong Microsoft Windows, một phần)
  • hexdump (trong GNU / Linux, v.v.)

Chỉnh sửa

Văn chương

  • Từ điển thế giới mới của Webster về thuật ngữ máy tính, thứ 4. Ed, Prentice Hall, NY, 1992. ISBN 0-671-84651-5
  • Leonneieend B. K. Định dạng tệp Microsoft Windows XP: Danh mục, M .: Nhà xuất bản mới CJSC, 2005. ISBN 5-9643-0059-6

Wikimedia Foundation. 2010.

Xem "tệp nhị phân" trong các từ điển khác là gì:

    Phụ, M., upatr. so. Thường hình thái: (Không) Cái gì? thư mục số? Tập tin, (xem) cái gì? tập tin hơn? Tập tin, những gì? về các tập tin; Mn. gì? Tập tin, (không) cái gì? tập tin hơn? Tập tin, (xem) cái gì? Tập tin hơn? Tập tin về những gì? Về tập tin 1. Tệp được gọi là một mảng ... ... Từ điển giải thích Dmitrieva.

    Tệp nhị phân (nhị phân) theo nghĩa rộng: chuỗi các byte tùy ý. Tên là do thực tế là byte bao gồm các bit, đó là các số nhị phân (eng. Nhị phân). Theo nghĩa hẹp của các tệp nhị phân từ trái ngược với các tệp văn bản. ... ... Wikipedia

    Tệp nhị phân (nhị phân) theo nghĩa rộng: chuỗi các byte tùy ý. Tên là do thực tế là byte bao gồm các bit, đó là các số nhị phân (eng. Nhị phân). Theo nghĩa hẹp của các tệp nhị phân từ phản đối ... ... Wikipedia

    tập tin cấu hình. - Tệp nhị phân hoặc văn bản chứa thông tin xác định hành vi của ứng dụng, máy tính hoặc thiết bị mạng. Mạng Điện toán mạng en cấu hình tập tin ... Danh mục dịch thuật kỹ thuật

    Thuật ngữ này có các giá trị khác, xem IPA (giá trị). .Ipa Định dạng tệp ứng dụng lưu trữ từ Apple cho iPhone, iPod Touch và iPad. Các tệp có tiện ích mở rộng này được lưu trữ trong cửa hàng App Store và được tải bằng iTunes cho ... ... Wikipedia

    Bài viết hoặc phần này cần tái chế. Không có mô-đun, oops và các xu hướng mới khác trong Pascal. Mô tả các tiện ích mở rộng chỉ có mặt trong các bài viết ... Wikipedia

    Pascal Paristics: Loại thực thi thủ tục: Trình biên dịch xuất hiện trong: 1970 Tác giả (s): Niklaus Wirth Pascal (tiếng Anh Pascal) ngôn ngữ lập trình đa năng cấp cao. Một trong những ngôn ngữ lập trình nổi tiếng nhất, rộng rãi ... ... Wikipedia

    Tên gopher: Cổng Gopher / ID: 70 / TCP Đặc điểm kỹ thuật: RFC 1436 Triển khai cơ bản (khách hàng): Mozilla Firefox, Microsoft Windows: IE 5.x, IE 6 (giới hạn MS) Giao thức mạng Gopher của tài liệu tìm kiếm và chuyển giao, trước đây là rộng ... Wikipedia.

    Tiêu đề: Cổng Gopher / ID: 70 / TCP Đặc điểm kỹ thuật: RFC 1436 Triển khai cơ bản (Khách hàng): Mozilla Firefox, Microsoft Windows: Internet Explorer 5.x, Internet Explorer 6 (MS) Giao thức mạng Gopher Tìm kiếm và chuyển giao giao thức phân tán. .. Wikipedia.

    - / * a b c d e f g h i j k l m n o p q r s t u v w x y z Lưu ý: Vì phần mở rộng tên tệp có thể là bất kỳ, danh sách được trình bày không hoàn thành ... Wikipedia