Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Đọc từng byte của file trong lập trình C#?

  1. #1
    No Avatar
    Shinichi Khách

    Mặc định Đọc từng byte của file trong lập trình C#?

    Tôi có một file lưu ở dạng Unicode 16. Khi mở = EmEditor thì có thể đọc = mắt bình thường, nhưng khi tôi dùng C# để đọc từng dòng (ReadLine) thì nó chỉ đọc được ký tự đầu tiên của dòng đầu tiên thôi, các dòng còn lại đều trả ra blank.Sau hỏi 1 người bạn thì mới biết cứ sau 1 ký tự bình thường thì nó chèn thêm vào 0x00

    Xin được hướng dẫn cách đọc nhị phân từng byte một để loại bỏ các ký tự 0x00 đó.

    Tôi post lên nội dung file đó :

    (mở trong EmEditor)

    BEGIN:VMSG
    VERSION:1.1
    X-IRMC-STATUS:READ
    X-IRMC-BOX:INBOX
    BEGIN:VCARD
    VERSION:2.1
    N:
    TEL:+84913568756
    END:VCARD
    BEGIN:VENV
    BEGIN:VCARD
    VERSION:2.1
    N:
    TEL:
    END:VCARD
    BEGIN:VENV
    BEGIN:VBODY
    Date:7/31/2006 10:20:57 PM
    ve roi ha,ko mat tay,chan, vay co mat con mat nao ko?haha,ngu ngon nha.
    END:VBODY
    END:VENV
    END:VENV
    END:VMSG
    Mở trong DOS (dùng lệnh type)

    B E G I N : V M S G
    V E R S I O N : 1 . 1
    X - I R M C - S T A T U S : R E A D
    X - I R M C - B O X : I N B O X
    B E G I N : V C A R D
    V E R S I O N : 2 . 1
    N :
    T E L : + 8 4 9 1 3 5 6 8 7 5 6
    E N D : V C A R D
    B E G I N : V E N V
    B E G I N : V C A R D
    V E R S I O N : 2 . 1
    N :
    T E L :
    E N D : V C A R D
    B E G I N : V E N V
    B E G I N : V B O D Y
    D a t e : 7 / 3 1 / 2 0 0 6 1 0 : 2 0 : 5 7 P M
    v e r o i h a , k o m a t t a y , c h a n , v a y c o m a t c o n m a t n a o k o ? h a h a , n g u n g o n n h a .
    E N D : V B O D Y
    E N D : V E N V
    E N D : V E N V
    E N D : V M S G

  2. #2
    Ngày gia nhập
    08 2006
    Bài viết
    60

    bạn phải tạo encoding thì phải. Tui dùng filestream và BinaryReader để đọc file. Hiện, máy tui 0 có msdn cũng như c# nên 0 nói cụ thể được. Bạn có thể tìm như tui nói là có thông tin thôi !

  3. #3
    Ngày gia nhập
    08 2006
    Nơi ở
    tp HCM
    Bài viết
    26

    Bạn xem thử mấy dòng code sau đây:

    Visual C# Code:
    1.  FileStream myFStream  = new FileStream("myFile.txt", ileMode.OpenOrCreate,FileAccess.ReadWrite);
    2.  myFStream.Position = 0 ;  //cho đọc từ byte thứ nhất
    3.  for (int i=0; i<256; i++)
    4.  {
    5.          // đọc từng byte xuất ra  Console
    6.          Console.Write(myFStream.ReadByte());
    7.  }
    8.  myFStream.Close();

  4. #4
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Tôi không rành về C# lắm. Nhưng qua cách mô tả của bạn về vấn đề đó thì có vẻ như bạn đã dịch và chạy chương trình trong chế độ ASSCII, như vậy hàm phương thức ReadLine sẽ hiểu là bạn muốn đọc một dòng ở chế độ ASCII (dĩ nhiên 0x00 là mã kết thúc xâu). Bạn thử dịch và chạy ở chế độ UNICODE xem (mà tôi tưởng là default là UNICODE - bạn có thể xem ở các pre processor).

    Gút lắc!

  5. #5
    No Avatar
    terryj Khách

    Trích dẫn Nguyên bản được gửi bởi Tarzan
    Tôi không rành về C# lắm. Nhưng qua cách mô tả của bạn về vấn đề đó thì có vẻ như bạn đã dịch và chạy chương trình trong chế độ ASSCII, như vậy hàm phương thức ReadLine sẽ hiểu là bạn muốn đọc một dòng ở chế độ ASCII (dĩ nhiên 0x00 là mã kết thúc xâu). Bạn thử dịch và chạy ở chế độ UNICODE xem (mà tôi tưởng là default là UNICODE - bạn có thể xem ở các pre processor).

    Gút lắc!
    Cái này liên quan đến set encoding cho các reader. Bạn có thể đọc file ở dạng từng byte 1 sau đó chuyển về string có encoding bằng lớp System.Text.Encoding(xem phương thức getString(Byte[])).

  6. #6
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Mặc định Đọc từng byte của file trong lập trình C#?

    Cậu dùng 1 hex editor, xem đầu file text của cậu có 2 byte FF FE hay FE FF không. Đây là 2 byte đánh dấu file UNICODE, còn gọi là BOM.
    Tui đã tạo thử 2 file UNICODE 16, 1 có BOM (1) và 1 không có BOM (2). Dùng chính VS 2005 để file (1) thì mở OK, hiển thị đúng, nhưng mở file (2) thì không mở được.
    Tui code thử 1 .NET console app, viết bằng C++/CLI, dùng StreamReader. Với file (1) thì mở, ReadLine và WriteLine OK, hiện ra đúng, nhưng với file (2) thì không hiển thị đúng.
    Tui đang tìm hiểu tại sao và cách khắc phục. Tui đang code tổng quát, nghĩa là đọc và hiển thị được các loại file text: ASCII, UTF, UNICODE (có BOM và không BOM).
    Code sau tạm chạy được, nhưng code bug nhiều.
    Visual C# Code:
    1. // PrintText.cpp : main cpp source file
    2. // Read an ASCII/Unicode text file and print to console
    3. // Compile with VS 2005, C++/CLI source, /clr compile option
    4.  
    5. #include "stdafx.h"
    6.  
    7. using namespace System::IO;
    8. using namespace System::Text;
    9.  
    10. int main(array<System::String ^> ^args)
    11. {
    12.     if (0 == args->Length)
    13.     {
    14.         Console::WriteLine("Please specify a text file.");
    15.         return -1;
    16.     }
    17.  
    18.     String^ fileName = args[0];
    19.     if (false == File::Exists(fileName))
    20.     {
    21.         Console::WriteLine("File {0} not found", fileName);
    22.         return -1;
    23.     }
    24.  
    25.     try
    26.     {
    27.         // Get static ASCII encoding.
    28.         Encoding^ ascii = Encoding::ASCII;
    29.  
    30.         // Open the text file
    31.         StreamReader^ sr = gcnew StreamReader(fileName, Encoding::ASCII, true);
    32.         String^ str = sr->ReadToEnd();
    33.  
    34.         // Convert the string into a byte[].
    35.         array<Byte>^ rawBytes = ascii->GetBytes(str);
    36.         if (0 != rawBytes[0])
    37.         {
    38.             array<Byte>^ asciiBytes = gcnew array<Byte>(rawBytes->Length);
    39.             for (int i = 0, j = 0; i < rawBytes->Length; i++)
    40.             {
    41.                 if (0 != rawBytes[i])
    42.                 {
    43.                     asciiBytes[j] = rawBytes[i];
    44.                     j++;
    45.                 }
    46.             }
    47.  
    48.             String^ lines = ascii->GetString(asciiBytes);
    49.  
    50.             Console::WriteLine("{0}", lines);
    51.         }
    52.  
    53.         // Close the file.
    54.         sr->Close();
    55.     }
    56.     catch (Exception^ e)
    57.     {
    58.         Console::WriteLine("Problem reading file '{0}'.\n{1}", fileName, e->Message);
    59.     }
    60.  
    61.     Console::ReadKey(true);
    62.     return 0;
    63. }

    PS: Không nhất thiết phải học C# để code .NET App, các bạn vẫn có thể tiếp tục dùng C++ để nhảy qua .NET với C++/CLI trong VS 2005. Nó được chính các MS coders đánh giá là ngôn ngữ mạnh nhất cho .NET hiện nay, trong khi C# được MS phát triển, marketing chỉ vì tính dễ học, dễ viết của nó. Rất nhiều thứ C# làm không được mà chỉ làm được với C++/CLI.
    Có gì sơ sót mong các bạn góp ý.

Các đề tài tương tự

  1. Kỹ thuật C++ Cách sửa bit cuối trong byte đọc từ file?
    Gửi bởi dragonz_vb trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 29-08-2013, 10:41 AM
  2. Lập trình C chia số 2 byte cho số 1 byte và cho kết quả thương là số 2 byte và phần dư là số 1 byte
    Gửi bởi sakurai111 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 17-11-2012, 10:58 PM
  3. Cách đọc file ảnh thành từng byte?
    Gửi bởi HUMG.ThongIT trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 15
    Bài viết cuối: 12-12-2011, 10:27 AM
  4. Open file từ 1 mảng kiểu byte
    Gửi bởi Michael trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 30-09-2011, 12:51 PM
  5. Đọc 45 byte đầu của 1 File exe mà sao chỉ được có 3 Byte
    Gửi bởi cSharp trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 08-02-2009, 10:25 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn