Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 6 của 6
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Đọ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 tham gia
    Sep 2015
    Bài viết
    0
    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 tham gia
    Sep 2015
    Bài viết
    0
    Bạn xem thử mấy dòng code sau đây:


    Mã:
     FileStream myFStream  = new FileStream("myFile.txt", ileMode.OpenOrCreate,FileAccess.ReadWrite); myFStream.Position = 0 ;  //cho đọc từ byte thứ nhất for (int i=0; i<256; i++) {         // đọc từng byte xuất ra  Console         Console.Write(myFStream.ReadByte()); } myFStream.Close();

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn 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 tham gia
    Sep 2015
    Bài viết
    0
    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.

    Mã:
    // PrintText.cpp : main cpp source file// Read an ASCII/Unicode text file and print to console// Compile with VS 2005, C++/CLI source, /clr compile option #include "stdafx.h" using namespace System;using namespace System::IO;using namespace System::Text; int main(array<System::String ^> ^args){    if (0 == args->Length)    {        Console::WriteLine("Please specify a text file.");        return -1;    }     String^ fileName = args[0];    if (false == File::Exists(fileName))    {        Console::WriteLine("File {0} not found", fileName);        return -1;    }     try     {        // Get static ASCII encoding.        Encoding^ ascii = Encoding::ASCII;         // Open the text file        StreamReader^ sr = gcnew StreamReader(fileName, Encoding::ASCII, true);        String^ str = sr->ReadToEnd();         // Convert the string into a byte[].        array<Byte>^ rawBytes = ascii->GetBytes(str);        if (0 != rawBytes[0])        {            array<Byte>^ asciiBytes = gcnew array<Byte>(rawBytes->Length);            for (int i = 0, j = 0; i < rawBytes->Length; i++)            {                if (0 != rawBytes[i])                {                    asciiBytes[j] = rawBytes[i];                    j++;                }            }             String^ lines = ascii->GetString(asciiBytes);             Console::WriteLine("{0}", lines);        }         // Close the file.        sr->Close();    }    catch (Exception^ e)    {        Console::WriteLine("Problem reading file '{0}'.
    {1}", fileName, e->Message);    }     Console::ReadKey(true);    return 0;}
    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 ý.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •