关于字符串“循环左移”算法的讨论
2011-08-16 21:43
393 查看
#include <stdio>
#include <stdlib>
#include <string>
#include <errno>
#define FILE_LEN 64
#define MAX_LINE 128
#define LINE 8
int main(int argc, char *argv[])
{
FILE *in, *out;
char file_name[FILE_LEN];
char buf[MAX_LINE];
char outbuf[MAX_LINE];
char head[LINE];
char *p;
int len;
if(argc != 2){ /* 命令格式错误,正确的格式为:命令名 配置文件名 */
printf("wrong usage\n");
exit(1);
}
len = strlen(argv[1]); /* 求文件名长度 */
if(strcmp(&argv[len - 3], "ini") != 0){ /* 比较其扩展名是否是"ini" */
printf("source file error\n");
exit(1);
}
in = fopen(argv[1], "rb"); /* 打开配置文件 */
if(in == NULL){
perror("fail to open");
exit(1);
}
strcpy(file_name, argv[1]); /* 将配置文件的扩展名改为"xml" */
strcpy(&file_name[len - 3], "xml");
out = fopen(file_name, "wb"); /* 打开".xml"文件,该文件的文件名和原配置文
件一样 */
if(out == NULL){
perror("fail to open");
exit(1);
}
while(fgets(buf, MAX_LINE, in) != NULL){ /* 顺序读取每一行 */
len = strlen(buf); /* 去掉最后一个'\n'结束符 */
buf[len - 1] = '\0';
if(buf[0] == '#') /* 书写配置信息头 */
sprintf(outbuf, "<!-- %s -->\n", buf);
else if(buf[0] == '!'){ /* 书写配置信息头 */
sprintf(outbuf, "\n", buf);
strcpy(head, buf); /* 复制一份,用于后面输出 */
}else if(buf[0] = '\0')
sprintf(outbuf, "%s>\n\n", head); /* 遇到空行,说明一个配置信息
结束,输出配置信息结尾 */
else{
p = strtok(buf, "="); /* 将原配置文件中的一行拆分为配置选项和配置内
容 */
sprintf(outbuf, "\t%s%s>\n", buf, p, buf);
}
if(fputs(outbuf, out) == NULL){ /* 将准备好的输出信息输出,每一行输出一
次 */
perror("fail to write");
exit(1);
}
}
if(errno != 0){ /* 循环结束,判断是否是因为文件读操作出错而退出 */
perror("fail to read");
exit(1);
}
fclose(in); /* 关闭文件 */
fclose(out);
return 0;
}</errno></string></stdlib></stdio>
#include <stdlib>
#include <string>
#include <errno>
#define FILE_LEN 64
#define MAX_LINE 128
#define LINE 8
int main(int argc, char *argv[])
{
FILE *in, *out;
char file_name[FILE_LEN];
char buf[MAX_LINE];
char outbuf[MAX_LINE];
char head[LINE];
char *p;
int len;
if(argc != 2){ /* 命令格式错误,正确的格式为:命令名 配置文件名 */
printf("wrong usage\n");
exit(1);
}
len = strlen(argv[1]); /* 求文件名长度 */
if(strcmp(&argv[len - 3], "ini") != 0){ /* 比较其扩展名是否是"ini" */
printf("source file error\n");
exit(1);
}
in = fopen(argv[1], "rb"); /* 打开配置文件 */
if(in == NULL){
perror("fail to open");
exit(1);
}
strcpy(file_name, argv[1]); /* 将配置文件的扩展名改为"xml" */
strcpy(&file_name[len - 3], "xml");
out = fopen(file_name, "wb"); /* 打开".xml"文件,该文件的文件名和原配置文
件一样 */
if(out == NULL){
perror("fail to open");
exit(1);
}
while(fgets(buf, MAX_LINE, in) != NULL){ /* 顺序读取每一行 */
len = strlen(buf); /* 去掉最后一个'\n'结束符 */
buf[len - 1] = '\0';
if(buf[0] == '#') /* 书写配置信息头 */
sprintf(outbuf, "<!-- %s -->\n", buf);
else if(buf[0] == '!'){ /* 书写配置信息头 */
sprintf(outbuf, "\n", buf);
strcpy(head, buf); /* 复制一份,用于后面输出 */
}else if(buf[0] = '\0')
sprintf(outbuf, "%s>\n\n", head); /* 遇到空行,说明一个配置信息
结束,输出配置信息结尾 */
else{
p = strtok(buf, "="); /* 将原配置文件中的一行拆分为配置选项和配置内
容 */
sprintf(outbuf, "\t%s%s>\n", buf, p, buf);
}
if(fputs(outbuf, out) == NULL){ /* 将准备好的输出信息输出,每一行输出一
次 */
perror("fail to write");
exit(1);
}
}
if(errno != 0){ /* 循环结束,判断是否是因为文件读操作出错而退出 */
perror("fail to read");
exit(1);
}
fclose(in); /* 关闭文件 */
fclose(out);
return 0;
}</errno></string></stdlib></stdio>
相关文章推荐
- 数组元素几个关于串的小算法题:最小K个数、连续子数组的最大和、字符串全排列求法、数组循环移位
- 几个关于串的小算法题:最小K个数、连续子数组的最大和、字符串全排列求法、数组循环移位
- 实现指定步长循环后移字符串数组算法
- 关于数组,字符串的几道面试题和算法题
- 关于算法—— 一维字符串数组之间组合问题的C#实现
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 算法:字符串解析之循环移位
- 简单的面试算法题:非循环求字符串长度和字符串拷贝源函数
- 关于字符串的常用算法
- 关于字符串和字符数组的再讨论
- 关于素数判断算法优化方法的讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于Storm与JStorm的调度算法的讨论
- 字符串算法之字符串循环左移
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于goto语句能不能从复杂的嵌套循环判断中跳出去的问题讨论
- 关于字符串比较的一点讨论---strcmp与memcmp的效率及实现原理