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

Đề tài: Làm sao để read and write struct data TCHAR

  1. #1
    Ngày gia nhập
    12 2008
    Bài viết
    7

    Mặc định Làm sao để read and write struct data TCHAR

    Mình viết đoạn code randFile sau để tạo 1 file bao gồm header và nhiều records. Với số record được lấy từ tham số của _tmain function.

    Ex: randFile NumOfRecord filename

    Code:
    #include "Everything.h"
    #define UNICODE
    #define STRING_SIZE 256
    typedef struct _RECORD { /* File record structure */
    	DWORD			referenceCount;  /* 0 meands an empty record */
    	SYSTEMTIME		recordCreationTime;
    	SYSTEMTIME		recordLastRefernceTime;
    	SYSTEMTIME		recordUpdateTime;
    	TCHAR			dataString[STRING_SIZE];
    } RECORD;
    typedef struct _HEADER { /* File header descriptor */
    	DWORD			numRecords;
    	DWORD			numNonEmptyRecords;
    } HEADER;
    //------------------
    int _tmain(int argc, LPTSTR argv[])
    {
    	//Declare
    	HANDLE hFile;
    	HEADER header;
    	RECORD record;
    	DWORD dwNumOfBlock,dwBytesRead,dwOpenOpt;
    	SYSTEMTIME systCurrentTime;
    	int i;
    
    	//Implement
    
    	if(argc < 3){
    		_tprintf("Usage: WriteUnicodeStruct NumOfBlock filename");
    		return 1;
    	}
    	dwNumOfBlock = _ttoi(argv[1]);
    	//Define Header
    	header.numRecords = dwNumOfBlock;
    	header.numNonEmptyRecords = 0;
    	//Define Record
    	record.referenceCount = 0;
    	GetSystemTime(&systCurrentTime);// Get current system time
    	record.recordCreationTime = record.recordUpdateTime = record.recordLastRefernceTime = systCurrentTime;
    	
    
    	hFile = CreateFile(argv[2],
    				GENERIC_READ | GENERIC_WRITE,
    				0,
    				NULL,
    				CREATE_NEW,
    				FILE_ATTRIBUTE_NORMAL,
    				NULL);
    	if(hFile == INVALID_HANDLE_VALUE){
    		ReportError(_T("Cannot Create new File"),1,TRUE);	
    	}
    		
    	//Write Header
    	if(!WriteFile(hFile,&header,sizeof(HEADER),&dwBytesRead,NULL))
    		ReportError(_T("Cannot write header"),2,TRUE);
    
    	for(i = 0;i < dwNumOfBlock;i++){
    		_tcscpy(record.dataString,_T("dsadasdasdasdsadasdasdsadsad"));
    		if(!WriteFile(hFile,&record,sizeof(RECORD),&dwBytesRead,NULL))
    			ReportError(_T("Cannot write records"),3,TRUE);
    	}
    	
    	SetEndOfFile(hFile);
    	CloseHandle(hFile);
    	system("pause");
    	return 0;
    }
    
    VOID ReportError(LPCTSTR userMessage, DWORD exitCode, BOOL printErrorMessage){
    	DWORD eMsgLen,errorNum = GetLastError();
    	LPTSTR lpvSysMsg;
    	_ftprintf(stderr,_T("%s\n"),userMessage);
    	if(printErrorMessage){
    		eMsgLen=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    								NULL,errorNum,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpvSysMsg,0,NULL);
    		if(eMsgLen > 0){
    			_ftprintf(stderr,"%s\n",lpvSysMsg);
    		}
    		else{
    			_ftprintf(stderr,_T("Last error number:%d\n"),errorNum);
    		}
    		if(lpvSysMsg != NULL) LocalFree(lpvSysMsg);
    	}
    
    	if(exitCode > 0){
    		ExitProcess(exitCode);
    	}
    
    	return;
    }
    Sau khi run bằng cmd:

    Code:
    randFile 10 test.txt
    Mình open file bằng notepad thì cái string write xuống file ko được như mình mong muốn như hình dưới.

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		test.png
Lần xem:	18
Size:		6.3 KB
ID:		7811

    Và mình muốn string write xuống như thế này

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		test2.png
Lần xem:	15
Size:		3.3 KB
ID:		7812

    Mình mới học,nhờ mọi người giúp đỡ
    Thanks.

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    TCHAR trong mode unicode là 2 byte, vì thế nó write như hình 1 là đúng, nếu muốn ghi được như hình 2 thì có 2 cách:

    1. Chuyển mode từ unicode sang not set (ASCII Mode). Trên cộng đồng C Việt cũng có quá nhiều nên Kevin không nhắc lại!
    2. Convert kiểu chuỗi TCHAR sang chuỗi CHAR

    Nên đọc thêm về kiểu TCHAR, WCHAR trên MSDN trước! Nói chung là cứ học bò trước, lúc chạy bạn sẽ chạy được vững vàng hơn!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Thử xóa #define UNICODE.
    Không thì bạn thử cách này:
    Visual C++ Code:
    1. char chChar[1024];
    2. WideCharToMultiByte(CP_UTF8,0,cstrString,cstrString.GetLength(),(LPSTR)chChar,cstrString.GetLength(),NULL,NULL);
    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 28-12-2011 lúc 10:55 PM.

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

  1. Connect , read/write smartcard bằng C#
    Gửi bởi thitcholaotien trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 02-01-2014, 04:24 PM
  2. Đọc và ghi tập tin bằng C# – read and write file with C# .net
    Gửi bởi qhhqnavy trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 12
    Bài viết cuối: 02-10-2012, 10:58 AM
  3. Gửi mảng xâu kí tự qua hàm read() và write()
    Gửi bởi DBRett trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 0
    Bài viết cuối: 10-04-2012, 01:12 AM
  4. Xin tài liệu về read-write với file trong C++
    Gửi bởi Sayuri0903 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 18-09-2010, 10:21 AM
  5. Read và write binary data trong C#?
    Gửi bởi Malib trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 11-04-2010, 07:37 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