-6

我现在真的很困惑如何处理 \n 和 \r\n 字符。我正在用 C++ 读写一些文件。

基本上我想在考虑以下条件的情况下维护一个 exe 的日志文件。

1)如果文件不存在,则创建文件。

2)如果文件已经存在,则在其上附加数据。

但是它无法正常工作的一些原因是我正在使用的一些代码块。

打开一个文件,我正在使用以下代码。

 bool ApplicationfileNotOpen;   
char* ApplicationFileLogName;
ApplicationFileLogName = ".\\ApplicationLog\\Sample.log";
HANDLE APllicationLogWriteHandle;
APllicationLogWriteHandle = CreateFile(ApplicationFileLogName, // name of the write
                    GENERIC_WRITE,          // open for writing
                    0,                      // do not share
                    NULL,                   // default security
                    CREATE_NEW,             // create new file only
                    FILE_ATTRIBUTE_NORMAL,  // normal file
                    NULL);                  // no attr. template  

要在文件中写入数据,我使用以下代码..

char MessageString[200];
MessageString = "Application Start \n";
time_t ApplicationNow = time(NULL);
ApplicationNow = time(NULL);
struct tm * timeinfo = localtime(&ApplicationNow);
char Applicationtimstring[100];
strftime (Applicationtimstring,32,"%d/%m/%Y %I:%M:%S %p",timeinfo);

char Temp_Char_Array[DEFAULT_ARRAY_SIZE];
StrCpy(Temp_Char_Array,Applicationtimstring);
StrCat(Temp_Char_Array,  MessageString);
DWORD dwBytesToWrite = (DWORD)strlen(Temp_Char_Array);
DWORD dwBytesWritten = 0;
BOOL bErrorFlag = FALSE;
bErrorFlag=WriteFile(ApplicationFileHandle, // open file handle
           Temp_Char_Array,      // start of data to write
           dwBytesToWrite,  // number of bytes to write
           &dwBytesWritten, // number of bytes that were written
           NULL);            // no overlapped structure  

为了从文件中读取,我正在使用以下代码。

char* ApplicationFileLogName;
ApplicationFileLogName = ".\\ApplicationLog\\Sample.log";
FILE *ApplicationfileOpenHandle;
 ApplicationfileOpenHandle =fopen(ApplicationFileLogName,"r");

//Read file..
while(fgets(CurrentString , DEFAULT_ARRAY_SIZE , ApplicationfileOpenHandle) != NULL)//Reading one by one line from file it UNICODE..
{
        printf("%s",CurrentString);
}

现在,当我在 notpad 中打开文件“sample.log”时,它会在同一行中显示所有内容。

10/05/2013 02:32:28 PM 申请开始 10/05/2013 02:32:36 PM 申请开始 10/05/2013 02:47:31 PM 申请开始

都在同一行,但是当我在写字板或文本板中打开它时,它会向我显示所有正确的内容,例如,

10/05/2013 02:32:28 PM 申请开始

10/05/2013 02:32:36 PM 申请开始

10/05/2013 02:47:31 PM 申请开始

请告诉我哪里出错了。

注意:- 我已经使用 \r\n 但它不起作用。.

4

2 回答 2

0

正如我所见,这是在窗户上。Windows 行分隔符是 CRLF ( \r\n)。记事本只能容忍这一点。Word 或写字板可以处理\n分隔符。在 unices 上,行分隔符是\n如此 unix gvim 也可以处理这个问题。

因此,要么\r\n在每行的末尾添加,要么使用文本查看器,它可以处理\n唯一的行尾。

于 2013-05-10T09:44:45.283 回答
-2

不同的系统期望不同的行尾。

Windows 传统上需要 \r\n,而 unix 只喜欢 \n。

您所看到的是一些应用程序更擅长处理不同的表示。记事本是脑死的,需要\r\n。写字板更聪明一些,可以处理 UNIX 风格的 \n。

http://en.wikipedia.org/wiki/Newline

于 2013-05-10T09:44:43.657 回答