c++歌词生成器

1. 要求:

    有原始歌词文件“xxx.lrc”,通过编写程序生成新的文件“完整歌词.txt”,内容应与正常播放顺序一致。

2. 代码:

#include <stdio.h>		
#include <stdlib.h>		
#include <vector>		
#include <string.h>	
#include <string>		
#include <algorithm>	

#define MAXLINE 256

using namespace std;

typedef struct Number {
	int time;//歌词时间 
	int line;//所在行 
};

static int LINE = 0;//记录歌词所在的行 

int LRCPrase(char *str, vector<string> &sentences, vector<Number> &songTime);
int strtoint(char *str);
int operator<(Number x, Number y);

int main(int argc, char *argv[]) {
	char buf[MAXLINE];

	vector<string> sentences, finalSentence;
	vector<Number> songTime;
	FILE *fd1, *fd2;

	fd1 = fopen("C:\\Users\\Lenovo\\Desktop\\七里香.lrc", "r");
	fd2 = fopen("C:\\Users\\Lenovo\\Desktop\\完整歌词.txt", "w");

	if (fd1 == NULL) {
		perror("open file");
		exit(1);
	}
	//处理歌词 
	while (fgets(buf, sizeof(buf), fd1) != NULL) {
		LRCPrase(buf, sentences, songTime);
	}
	sort(songTime.begin(), songTime.end());
	//按照时间排序 

	vector<Number>::iterator it1 = songTime.begin();
	for (; it1 != songTime.end(); it1++) {
		finalSentence.push_back(sentences[(*it1).line]);
	}

	//写入指定的文件中
	it1 = songTime.begin();
	vector<string>::iterator it = finalSentence.begin();
	for (; it1 != songTime.end() && it != finalSentence.end(); it1++, it++) {
		fputs((*it).c_str(),fd2);
	}

	return 0;
}

int LRCPrase(char *str, vector<string> &sentences, vector<Number> &songTime) {
	if (strlen(str) == 1) {//空行 
		return 0;
	}
	else {
		char *p, *q, *temp = NULL;
		q = str;
		//处理时间
		while ((p = strchr(q, '[')) != NULL && (temp = strchr(q, ']')) != NULL) {
			q = p + 1;
			q[temp - q] = '\0';

			struct Number number;
			if ((number.time = strtoint(q)) < 0) {
				return 0;
			}
			number.line = LINE;
			songTime.push_back(number);
			q = temp + 1;
		}
		p = ++temp;
		while (*temp != NULL) {
			temp++;
		}
		p[temp - p] = '\0';
		string s(p);
		sentences.push_back(s);
		LINE++;
		return 1;
	}

}
//把char转换为int 
int chartoint(char ch) {
	return ch - '0';
}

int strtoint(char *str) {//计算时间,微秒 
	if (isdigit(str[0]) && isdigit(str[1])
		&& isdigit(str[0]) && isdigit(str[0])
		&& isdigit(str[0]) && isdigit(str[0])) {
		int mintue = chartoint(str[0]) * 10 + chartoint(str[1]);
		int second = chartoint(str[3]) * 10 + chartoint(str[4]);
		int microsecond = chartoint(str[6]) * 10 + chartoint(str[7]);
		return (mintue * 60 + second) * 1000 + microsecond * 10;
	}
	return -1;
}
//重载<操作符,用在sort函数比较中 
int operator<(Number x, Number y) {
	return x.time < y.time;
}

3. 运行结果:

        处理前文件:



处理后文件:


猜你喜欢

转载自blog.csdn.net/jzjz73/article/details/80501180