MP4电子书显示不完全的解决方案

StarCrafter 2007-10-12 07:17:39
MP4电子书显示不完全的解决方案

用过MP4看电子书的朋友,不知你是否遇到过这样的问题:

一个txt文件,在电脑上显示正常,但在MP4中每段的最后一行显示不完全。

其实这不是MP4的问题,是文件的问题。
在txt中,是以ASC码为10的字符作为换行符的,但某些网站提供的txt却是用13和10两个字节作为换行符的,这样的字符序列是MP4所不能识别的,于是产生了上面的问题。
目前我已找到了5种解决方案,这里只讨论编程的方法。


程序的要求是:删除当前文件夹及其子文件夹中所有txt文件中ASC码为13的字节。

这里我遇到了两个问题,

第一,我要获得当前文件夹及其子文件夹中所有txt文件的文件名,于是我调用dos命令
dir/b/s *.txt
或者
for /r %f in (*.txt) do ....

但问题是,我不知道怎么把产生的数据保存到c++的变量中去
现在的解决方法是,先把这些数据保存到文件中,再从文件中读取
这样做虽可以解决问题,但不直接,不优雅(很多时候我感觉程序的优雅性很重要)

怎么才能把dos中的数据存放到c++的变量中去呢?


第二,我要删除文件中ASC码为13的字符。
如果生成一个原文件的副本,那很简单,但这样会产生许多多余的文件,而且复制过程也很费时,怎么直接在原文件中操作呢?

换句话说,我只会对文件进行只读,只写操作,不会同时读写操作,还望各位不吝赐教。


为了验证程序的可行性,还请各位贴出完整的可直接编译的代码。


...全文
5315 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2007-10-15
  • 打赏
  • 举报
回复
写一个程序 conv.exe <file> 从命令行参数读取需要处理的文件
for /r %f in (*.txt) do conv.exe %f
就可以。

转换 \r\n 到 \n 更简单,直接把 \r\n 替换成 \0\n 或者 " \n" 就可以。既然是行末,多一个空白也不是问题吧。
yuanchuang 2007-10-15
  • 打赏
  • 举报
回复
兄弟,如果你觉得写程序麻烦,可以到linux系统下用dos2unix转换一下就行了,呵呵
StarCrafter 2007-10-15
  • 打赏
  • 举报
回复
up3
Gao_TF 2007-10-14
  • 打赏
  • 举报
回复
收藏,学习
StarCrafter 2007-10-14
  • 打赏
  • 举报
回复
up2
StarCrafter 2007-10-13
  • 打赏
  • 举报
回复
up
yuanchuang 2007-10-12
  • 打赏
  • 举报
回复
兄弟,如果要求不高的话,最简单的方法就是把ASC码为13的字符替换为空格
jixingzhong 2007-10-12
  • 打赏
  • 举报
回复
仅供参考:
DEV C++, 利用链表实现目录内所有文件列表显示

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>

int main(int argc,char *argv[])
{
DIR *directory_pointer;
struct dirent *entry;
struct FileList
{
char filename[64];
struct FileList *next;
}start,*node;

char dir[80];
puts("Please input the directory:");
gets(dir);
if ((directory_pointer=opendir(dir))==NULL)
printf("Error opening %s\n",dir);
else
{
start.next=NULL;
node=&start;
while ((entry=readdir(directory_pointer))!=NULL)
{
node->next=(struct FileList *)malloc(sizeof(struct FileList));
node=node->next;
strcpy(node->filename,entry->d_name);
node->next=NULL;
}
closedir(directory_pointer);
node=start.next;
while(node)
{
printf("%s\n",node->filename);
node=node->next;
}
}
system("PAUSE");
return 0;
}


建议楼主看看findfirst 以及 findnext 函数的reference
jixingzhong 2007-10-12
  • 打赏
  • 举报
回复
第一,我要获得当前文件夹及其子文件夹中所有txt文件的文件名,于是我调用dos命令

方法1: 命令输出重定向到一个 临时的txt文件,然后程序中读取该txt文件获得要处理的文件名
方法2: 不使用dos命令方式,直接遍历指定文件夹,对遍历文件夹得到的文件列表进行文件类型的判断,即判断末尾四字符是否为“.txt”即可。
jixingzhong 2007-10-12
  • 打赏
  • 举报
回复
删除字符在原文件中操作控制过程相当繁琐,且效率低下。

可以顺序处理文件,
那么只需要一个 temp 文件即可

65,203

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧