今天写个txt文章转换为html段落的小代码,结果一个地方搞了好一会才发现是哪个地方写错了:
#include <string>
#include <stdio.h>
void main(int argc, char** argv)
{
if(argc < 2)
{
printf("file name failed!!!\n");
char k;
scanf("%c", &k);
return;
}
FILE * fp = fopen(argv[1], "r");
if(fp == NULL)
{
printf("file open failed!!!\n");
char k;
scanf("%c", &k);
return;
}
fseek(fp, 0, SEEK_END);
long fszie = ftell(fp);
fseek(fp, 0, SEEK_SET);
if(fszie == -1)
{
printf("file size failed!!!\n");
char k;
scanf("%c", &k);
return;
}
char* sz_str = new char[fszie+1];
sz_str[fszie] = '\0';
if(fread(sz_str, 1, fszie, fp) <= 0)
{
printf("file size failed!!!\n");
char k;
scanf("%c", &k);
return;
}
std::string text = sz_str;
std::string output_str = "<p>";
int i = 0;
while(sz_str[i] != '\0')
{
while(sz_str[i] != '\0')//换行符 break
{
if(sz_str[i] == '\r')//换行符 break
{
if(sz_str[i] != '\n')
{
printf("file find \\r but not find \\n failed!!!\n");
char k;
scanf("%c", &k);
return;
}
break;
}else if(sz_str[i] == '\n')//换行符 break
break;
//处理空格和tab
if(sz_str[i] == ' ')
output_str += " ";
else if(sz_str[i] == '\t')
output_str += " ";
else if(sz_str[i] != 0xcd)
output_str += sz_str[i];
i++;
}
if(sz_str[i] == '\0')
break;
else //碰到换行符了
{
output_str += "</br>";
i++;
}
}
output_str += "</p>";
fclose(fp);
fp = fopen(argv[1], "w");
if(fp == NULL)
{
printf("file open failed!!!\n");
char k;
scanf("%c", &k);
return;
}
fwrite(output_str.c_str(), output_str.size(), 1, fp);
fclose(fp);
}
就错在了
else if(sz_str[i] != 0xcd)
这一行 我用调试器看了变量值明明就是0xcd啊,那是为何呢?后来理了理头绪,改为 else if(sz_str[i] != (char)0xcd) 就好了
因为之前代码表达式 由char提升为int ,结果sz_str[i]提升为int会变成一个负数, 而0xcd会变成 一个小整数。主要当时把他们看成原始二级制了(无符号)如果改为:
else if((unsigned char)sz_str[i] != (unsigned char)0xcd) 也是可以的