我现在真的很困惑如何处理\ n和\ r \ n charecters。我正在用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 Application Start 10/05/2013 02:32:36 PM Application Start 10/05/2013 02:47:31 PM Application Start < / p>
全部在同一行,但当我在wordpad或textpad中打开它时,它会显示所有内容,例如,
10/05/2013 02:32:28 PM应用程序开始
10/05/2013 02:32:36 PM应用程序开始
10/05/2013 02:47:31 PM应用程序开始
请告诉我我哪里出错了。注意: - 我已经使用\ r \ n但它不起作用。
答案 0 :(得分:0)
我认为这是在Windows上。 Windows行分隔符是CRLF(\r\n
)。记事本只能容忍这一点。 Word或wordpad可以处理\n
分隔符。在unices上,行分隔符为\n
,因此unix gvim也可以处理它。
因此,要么在每行的末尾添加\r\n
,要么使用文本查看器,它只能处理\n
行结尾。
答案 1 :(得分:-2)
不同的系统期望不同的行结尾。
Windows传统上需要\ r \ n,而unix更喜欢\ n。
你看到的是一些应用程序在处理不同的表示方面更好。记事本是脑死亡,并期望\ r \ n。写字板有点聪明,可以处理UNIX风格的\ n。