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. 运行结果:
处理前文件:
处理后文件: