菜鸟求救。。。两个新手级别问题

Justin_Py 2014-03-24 01:03:49
1、现在有许多同一类型文件在一个文件夹下的不同子文件夹中,文件夹嵌套超过2层,怎么样去读取?是遍历一遍全部复制到主文件夹目录下面然后在读取吗?

2、怎么实现一个字符串中的关键词标记?
例如:现有一个字符串vector保存了n个关键词,如“王菲”“陈奕迅”等,有一个字符串为“王菲和陈奕迅共同演唱的歌”,我需要通过比较把后面那个字符串改为“#王菲#和#陈奕迅#共同演唱的歌”。有没有除了插入#以外的方法?(插入的方法太依赖顺序了)
...全文
183 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
derekrose 2014-03-24
  • 打赏
  • 举报
回复
引用 15 楼 candycentury 的回复:
[quote=引用 14 楼 derekrose 的回复:] [quote=引用 13 楼 candycentury 的回复:] [quote=引用 11 楼 derekrose 的回复:] 为什么要循环,假如“陈奕迅和王菲合唱的歌曲” 这是原始字符串 那么我们一开始找到陈奕迅,初始结尾index是0和2 那么str.insert(0, 1, '#'); 然后 str.insert(2+1, 1, '#');不就行了 现在字符串变成了“#陈奕迅#和王菲合唱的歌曲” 然后再找王菲的
= =这只是个例子,我需要批量操作这种标记关键词,有两个vector,一个里面全是女歌手的名字,一个里面全是男歌手的名字。然后有一批目标字符串,从第一个字符串然后开始对其查找,看字符串里有没有女歌手,男歌手,有的话就标记出来,然后下一个字符串。需要实现这样一个功能。。。[/quote] 当然可以,迭代备选数组就可以了[/quote] 我终于明白你的意思了,可以先查找所有男歌手的位置,把所有的男歌手标出来,然后用生成的字符串查找所有女歌手的位置,再标注所有女歌手。[/quote] No 必须一个一个找,这样insert的时候好计算位置,如果一起找的话,位置的计算以及代码不好维护
Justin_Py 2014-03-24
  • 打赏
  • 举报
回复
引用 14 楼 derekrose 的回复:
[quote=引用 13 楼 candycentury 的回复:] [quote=引用 11 楼 derekrose 的回复:] 为什么要循环,假如“陈奕迅和王菲合唱的歌曲” 这是原始字符串 那么我们一开始找到陈奕迅,初始结尾index是0和2 那么str.insert(0, 1, '#'); 然后 str.insert(2+1, 1, '#');不就行了 现在字符串变成了“#陈奕迅#和王菲合唱的歌曲” 然后再找王菲的
= =这只是个例子,我需要批量操作这种标记关键词,有两个vector,一个里面全是女歌手的名字,一个里面全是男歌手的名字。然后有一批目标字符串,从第一个字符串然后开始对其查找,看字符串里有没有女歌手,男歌手,有的话就标记出来,然后下一个字符串。需要实现这样一个功能。。。[/quote] 当然可以,迭代备选数组就可以了[/quote] 我终于明白你的意思了,可以先查找所有男歌手的位置,把所有的男歌手标出来,然后用生成的字符串查找所有女歌手的位置,再标注所有女歌手。
derekrose 2014-03-24
  • 打赏
  • 举报
回复
引用 13 楼 candycentury 的回复:
[quote=引用 11 楼 derekrose 的回复:] 为什么要循环,假如“陈奕迅和王菲合唱的歌曲” 这是原始字符串 那么我们一开始找到陈奕迅,初始结尾index是0和2 那么str.insert(0, 1, '#'); 然后 str.insert(2+1, 1, '#');不就行了 现在字符串变成了“#陈奕迅#和王菲合唱的歌曲” 然后再找王菲的
= =这只是个例子,我需要批量操作这种标记关键词,有两个vector,一个里面全是女歌手的名字,一个里面全是男歌手的名字。然后有一批目标字符串,从第一个字符串然后开始对其查找,看字符串里有没有女歌手,男歌手,有的话就标记出来,然后下一个字符串。需要实现这样一个功能。。。[/quote] 当然可以,迭代备选数组就可以了
Justin_Py 2014-03-24
  • 打赏
  • 举报
回复
引用 11 楼 derekrose 的回复:
为什么要循环,假如“陈奕迅和王菲合唱的歌曲” 这是原始字符串 那么我们一开始找到陈奕迅,初始结尾index是0和2 那么str.insert(0, 1, '#'); 然后 str.insert(2+1, 1, '#');不就行了 现在字符串变成了“#陈奕迅#和王菲合唱的歌曲” 然后再找王菲的
= =这只是个例子,我需要批量操作这种标记关键词,有两个vector,一个里面全是女歌手的名字,一个里面全是男歌手的名字。然后有一批目标字符串,从第一个字符串然后开始对其查找,看字符串里有没有女歌手,男歌手,有的话就标记出来,然后下一个字符串。需要实现这样一个功能。。。
赵4老师 2014-03-24
  • 打赏
  • 举报
回复
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
derekrose 2014-03-24
  • 打赏
  • 举报
回复
为什么要循环,假如“陈奕迅和王菲合唱的歌曲” 这是原始字符串 那么我们一开始找到陈奕迅,初始结尾index是0和2 那么str.insert(0, 1, '#'); 然后 str.insert(2+1, 1, '#');不就行了 现在字符串变成了“#陈奕迅#和王菲合唱的歌曲” 然后再找王菲的
Justin_Py 2014-03-24
  • 打赏
  • 举报
回复
引用 8 楼 derekrose 的回复:
[quote=引用 7 楼 candycentury 的回复:] [quote=引用 6 楼 derekrose 的回复:] [quote=引用 5 楼 candycentury 的回复:] [quote=引用 3 楼 derekrose 的回复:] 1.肯定不用你这样做 你去google一下 2.插入的方法太依赖顺序了?不懂你什么意思 为什么会依赖顺序
第二个问题我没讲清楚,就是我上面那个例子当中,我是用string::find_first_of的方法确定了在字符串中的相对位置,然后做排序,再依次在字符串中一个个插入#,每插入一个就把后面的相对位置后挪一位。这样有个问题,例如我想把王菲和陈奕迅用不同的字符标出来,比如#王菲#、*陈奕迅*,那就不能排序了。[/quote] 排序?为什么要排序? 直接string::insert不就可以了?[/quote] 你不是用循环一个个insert的吗?我都是用相对地址insert的,如果插入了第一个#,那后面在插入时相对地址就要+1,了,否则不就不对齐了吗?[/quote] 不要说一些容易混淆的词汇,相对地址??

// inserting into a string
#include <iostream>
#include <string>

int main ()
{
  std::string str="to be question";
  std::string str2="the ";
  std::string str3="or not to be";
  std::string::iterator it;

  // used in the same order as described above:
  str.insert(6,str2);                 // to be (the )question
  str.insert(6,str3,3,4);             // to be (not )the question
  str.insert(10,"that is cool",8);    // to be not (that is )the question
  str.insert(10,"to be ");            // to be not (to be )that is the question
  str.insert(15,1,':');               // to be not to be(:) that is the question
  it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
  str.insert (str.end(),3,'.');       // to be, not to be: that is the question(...)
  str.insert (it+2,str3.begin(),str3.begin()+3); // (or )

  std::cout << str << '\n';
  return 0;
}
哪里需要循环[/quote] 首先谢谢你的耐心解答,insert的用法我看了。但是这些用法我不都没想到怎么去实现目前我想要的功能。我在描述下我想要的功能。 我有一个字符串vector里面包含已有的关键词,关键词数目不定,如“王菲”、“陈奕迅”等,有另外一个需要标注的字符串,如“陈奕迅和王菲合唱的歌曲”,我需要把男女歌手分别标出来,男用#陈奕迅#,女用*王菲*,就是从“陈奕迅和王菲合唱的歌曲”到“#陈奕迅#和*王菲*合唱的歌曲”这样一个简单的转化。如果要标注,自然要一个个标,vector[0]先比较,然后得到以开头为基准的相对位置,然后insert一个#或者*,然后再是vector[1],...这样写一个循环,是我原先的构想。
jiangjianANT 2014-03-24
  • 打赏
  • 举报
回复
第一个问题你是是想把当前目录下面所有的文件,包括当前目录的子目录的下面的文件读取出来是吧..... 那你可以用long _findfirst( char *filespec, struct _finddata_t *fileinfo )这个函数,然后递归的读取当前目录下的所有文件(包括子目录的)。 下面代码也许你可以参考:
#include<iostream>
#include<io.h>
#include<string>
using namespace std;

void scanFileDepth(string fileName,int &numFile,int depth=1)
{	
	const char* CfileName=fileName.c_str();
	_finddata_t fileContent;
	long handle;
	if((handle=_findfirst(CfileName,&fileContent))!=-1)
	{
		if(strcmp(fileContent.name,"..")!=0&&strcmp(fileContent.name,".")!=0)
		{
			if(fileContent.attrib==_A_SUBDIR)
			{
				for(int i=0;i<depth;i++)
				{
					cout<<"-----";
				}
			}
			else
			{
				for(int i=0;i<depth;i++)
				{
					cout<<"     ";
				}
				numFile++;
				
			}
			
			cout<<fileContent.name<<endl;
		}
		//system("pause");
		if(fileContent.attrib==_A_SUBDIR&&strcmp(fileContent.name,"..")!=0&&strcmp(fileContent.name,".")!=0)
		{
			chdir(fileContent.name);
			scanFileDepth(fileName,numFile,depth+1);
		}
		while(_findnext(handle,&fileContent)==0)
		{
			if(strcmp(fileContent.name,"..")!=0&&strcmp(fileContent.name,".")!=0)
			{
				if(fileContent.attrib==_A_SUBDIR)
				{
					for(int i=0;i<depth;i++)
					{
						cout<<"-----";
					}
				}
				else
				{
					for(int i=0;i<depth;i++)
					{
						cout<<"     ";
					}
					numFile++;
				}
				cout<<fileContent.name<<endl;
			}
			//	system("pause");
			if(fileContent.attrib==_A_SUBDIR&&strcmp(fileContent.name,"..")!=0&&strcmp(fileContent.name,".")!=0)
			{
				chdir(fileContent.name);
				scanFileDepth(fileName,numFile,depth+1);
			}
		}
		
	}
	chdir("..");
	
	
}

int main()
{
	int numFile=0;
	scanFileDepth("*",numFile);
	cout<<"文件总数:"<<numFile<<endl;
	return 0;
}
这里面做了一下文件结构的格式,你不需要可以将格式输出部分注释了,你若要指定特定的后缀,可以再主程序的scanFileDepth("*",numFile)中把“*”改了,如.txt文件改成".txt". 关于第二个问题我也没看懂你想表达什么....对某些特定的字符串添加标注应该是不难的.
derekrose 2014-03-24
  • 打赏
  • 举报
回复
引用 7 楼 candycentury 的回复:
[quote=引用 6 楼 derekrose 的回复:] [quote=引用 5 楼 candycentury 的回复:] [quote=引用 3 楼 derekrose 的回复:] 1.肯定不用你这样做 你去google一下 2.插入的方法太依赖顺序了?不懂你什么意思 为什么会依赖顺序
第二个问题我没讲清楚,就是我上面那个例子当中,我是用string::find_first_of的方法确定了在字符串中的相对位置,然后做排序,再依次在字符串中一个个插入#,每插入一个就把后面的相对位置后挪一位。这样有个问题,例如我想把王菲和陈奕迅用不同的字符标出来,比如#王菲#、*陈奕迅*,那就不能排序了。[/quote] 排序?为什么要排序? 直接string::insert不就可以了?[/quote] 你不是用循环一个个insert的吗?我都是用相对地址insert的,如果插入了第一个#,那后面在插入时相对地址就要+1,了,否则不就不对齐了吗?[/quote] 不要说一些容易混淆的词汇,相对地址??

// inserting into a string
#include <iostream>
#include <string>

int main ()
{
  std::string str="to be question";
  std::string str2="the ";
  std::string str3="or not to be";
  std::string::iterator it;

  // used in the same order as described above:
  str.insert(6,str2);                 // to be (the )question
  str.insert(6,str3,3,4);             // to be (not )the question
  str.insert(10,"that is cool",8);    // to be not (that is )the question
  str.insert(10,"to be ");            // to be not (to be )that is the question
  str.insert(15,1,':');               // to be not to be(:) that is the question
  it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
  str.insert (str.end(),3,'.');       // to be, not to be: that is the question(...)
  str.insert (it+2,str3.begin(),str3.begin()+3); // (or )

  std::cout << str << '\n';
  return 0;
}
哪里需要循环
Justin_Py 2014-03-24
  • 打赏
  • 举报
回复
引用 6 楼 derekrose 的回复:
[quote=引用 5 楼 candycentury 的回复:] [quote=引用 3 楼 derekrose 的回复:] 1.肯定不用你这样做 你去google一下 2.插入的方法太依赖顺序了?不懂你什么意思 为什么会依赖顺序
第二个问题我没讲清楚,就是我上面那个例子当中,我是用string::find_first_of的方法确定了在字符串中的相对位置,然后做排序,再依次在字符串中一个个插入#,每插入一个就把后面的相对位置后挪一位。这样有个问题,例如我想把王菲和陈奕迅用不同的字符标出来,比如#王菲#、*陈奕迅*,那就不能排序了。[/quote] 排序?为什么要排序? 直接string::insert不就可以了?[/quote] 你不是用循环一个个insert的吗?我都是用相对地址insert的,如果插入了第一个#,那后面在插入时相对地址就要+1,了,否则不就不对齐了吗?
derekrose 2014-03-24
  • 打赏
  • 举报
回复
引用 5 楼 candycentury 的回复:
[quote=引用 3 楼 derekrose 的回复:] 1.肯定不用你这样做 你去google一下 2.插入的方法太依赖顺序了?不懂你什么意思 为什么会依赖顺序
第二个问题我没讲清楚,就是我上面那个例子当中,我是用string::find_first_of的方法确定了在字符串中的相对位置,然后做排序,再依次在字符串中一个个插入#,每插入一个就把后面的相对位置后挪一位。这样有个问题,例如我想把王菲和陈奕迅用不同的字符标出来,比如#王菲#、*陈奕迅*,那就不能排序了。[/quote] 排序?为什么要排序? 直接string::insert不就可以了?
Justin_Py 2014-03-24
  • 打赏
  • 举报
回复
引用 3 楼 derekrose 的回复:
1.肯定不用你这样做 你去google一下 2.插入的方法太依赖顺序了?不懂你什么意思 为什么会依赖顺序
第二个问题我没讲清楚,就是我上面那个例子当中,我是用string::find_first_of的方法确定了在字符串中的相对位置,然后做排序,再依次在字符串中一个个插入#,每插入一个就把后面的相对位置后挪一位。这样有个问题,例如我想把王菲和陈奕迅用不同的字符标出来,比如#王菲#、*陈奕迅*,那就不能排序了。
Justin_Py 2014-03-24
  • 打赏
  • 举报
回复
引用 1 楼 truelance 的回复:
你没把问题讲明白. 比如第一个问题: 为什么你不直接读子目录下的文件? 是你不知道怎么读? 还是你的项目有什么限制?
因为文件很多,一个个读取,分别在不同的子文件夹中,路径是不定的。比如1.txt在子文件夹A下面,2.tex在子文件夹B下面,~~~现在我要把主目录下所有的*.txt依次读取。
derekrose 2014-03-24
  • 打赏
  • 举报
回复
1.肯定不用你这样做 你去google一下 2.插入的方法太依赖顺序了?不懂你什么意思 为什么会依赖顺序
spaceman10 2014-03-24
  • 打赏
  • 举报
回复
1.有直接的api函数。 2.相当于自己定义个约定会协议,怎么的都可以。
熊熊大叔 2014-03-24
  • 打赏
  • 举报
回复
你没把问题讲明白. 比如第一个问题: 为什么你不直接读子目录下的文件? 是你不知道怎么读? 还是你的项目有什么限制?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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