应项目要求,需要对一个txt的文档进行读写,然后进行字符串拼接,于是使用下程序
static int Read_Feedback_Information ( char *path, char *buffer )
{
int data = 0;
memset(buffer, 0, BUFFER_SIZE);
/*
* FILE_NAME是文件名,r+代表可以读写文件
*/
FILE *fp = fopen(path, READ_MODE);
if ( fp == NULL )
{
printf ( "open error\n" );
return -1;
}
fgets(buffer, BUFFER_SIZE, fp);
fclose(fp);
if ( !strcmp (TRUE_KEY, buffer) )
{
printf("Feedback information true: %s\n", buffer);
return 0;
}
printf("Feedback information false: %s\n", buffer);
return 1;
}
当对linux格式下的txt文档进行读写是,
Read_Line_Data ( CONF_CALL, DEVICE_ID_KEY, buf );
buf[strlen(buf)-1]='\0';
读写出来的数据是正常的,也可以进行字符串拼接
但是当txt文档是在windows环境下生成的,就出问题了,按上面方式读出来的数据进行字符串拼接时,出现很诡异的现象,总是会后面拼接的数据重叠前面的数据
当时用修改后的程序才正常
static int Read_Line_Data ( char *path, char *keyword, char *buffer )
{
int data = 0;
char dst[BUFFER_SIZE]={0};
char tmp[BUFFER_SIZE]={0};
memset(buffer, 0, BUFFER_SIZE);
/*
* FILE_NAME是文件名,r+代表可以读写文件
*/
FILE *fp = fopen(path, READ_MODE);
if ( fp == NULL )
{
printf ( "open error\n" );
return -1;
}
while(fgets(dst, BUFFER_SIZE, fp))
{
/*
* 在文件中查找符合条件的那一行内容
*/
sscanf ( dst, "%[^=]=%[^=]", tmp, buffer );
if ( !strcmp (keyword, tmp) )
{
buffer[strlen(buffer)-1]='\0';
buffer[strlen(buffer)-1]='\0';
break;
}
}
fclose(fp);
return 0;
}
原因就是linux下的txt文档一行结束是以'\n'结束的,windows上ftp到unix主机的时候,会默认的在行尾加^M。
可采用上面的程序读写来解决,或者用以下方式:
1. 在本地打开文件的时候,保存到服务器的时候选择ascii码格式,上传之后就不会出现了。
这种文本编辑工具很多,用ue就ok。
2. unix上面使用vi打开文件,在编辑的时候使用替换命令,如下:
:%s/^M//g (全文替换^M为空)
3. 使用强大的sed命令,组合参数实现替换。如下:
sed 's/^M$//g > newfilename
4. 使用unix上面的工具,unix2dos和dos2unix。
使用方法如下:unix2dos filename1 filename2
注意:有些机器上是没有安装这个工具的,那就不能用这个办法了。
注2:^和M作为特殊字符,如何打印出来?
^:ctrl+v
M:ctrl+m