User Name Password Register
DaniWeb IT Discussion Community
All
What is DaniWeb IT Discussion Community?
You're currently browsing the C++ section within the Software Development category of DaniWeb, a massive community of 392,045 software developers, web developers, Internet marketers, and tech gurus who are all enthusiastic about making contacts, networking, and learning from each other. In fact, there are 4,306 IT professionals currently interacting right now! Registration is free, only takes a minute and lets you enjoy all of the interactive features of the site.
Please support our C++ advertiser:
Views: 525 | Replies: 12
Reply
Join Date: Apr 2008
Posts: 44
Reputation: Cybulski is an unknown quantity at this point 
Rep Power: 1
Solved Threads: 2
Sponsor
Cybulski's Avatar
Cybulski Cybulski is offline Offline
C++ wannabe

Iterator assertion failure. How?

  #1  
May 14th, 2008
Hello everyone. Welcome to my first post.

I have problem, it didn't brough me here, but maybe someone figure it out, I'm staring at this piece of code for hour. I'm trying to make directory listing class. It puts filenames and directories to vectors. It's not finished, yet not working loop:

while(iter_vsDirectory != v_sDirectories.end())
{
  while(FindNextFile(hFind, &foundFileInfo))
  {
      cout << foundFileInfo.cFileName;
      if(foundFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
      {
          cout << " dir" << endl;
          if(s_currentDir.compare(foundFileInfo.cFileName) && s_parrentDir.compare(foundFileInfo.cFileName))
          {
               path = foundFileInfo.cFileName;
               path.append("\\*");
               v_sDirectories.push_back(path);
               cout << "Pushed back to dir vector: " << v_sDirectories.back() << endl;
           }
        }
        else
        {
             cout << " file";
             v_sFiles.push_back(foundFileInfo.cFileName);
         }
         cout << endl;
      }
   iter_vsDirectory++;
}

In meantime I'll try make this code readable.
Last edited by Cybulski : May 14th, 2008 at 7:42 am.
AddThis Social Bookmark Button
Reply With Quote  
Join Date: Aug 2005
Location: near St Louis, Missouri, USA
Posts: 10,561
Reputation: Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of 
Rep Power: 36
Solved Threads: 860
Moderator
Featured Poster
Ancient Dragon's Avatar
Ancient Dragon Ancient Dragon is offline Offline
Most Valuable Poster

Re: Iterator assertion failure. How?

  #2  
May 14th, 2008
My guess is that neither of those loops will work.
1) how is iter_vsDirectory initialized? You failed to post it.

2) what is the purpose of that first loop with the iterator ? The iterator doesn't appear to be used anywhere within the loop. Adding more strings to the end of the vector might invalidate the iterator.

3) You have to call FindFirstFile() before you can start a loop for FindNextFile(). The FindNextFile() you have code will always fail.

HANDLE hFile = FindFirstFile( // blabla );
if( hFile != INVALID_HANDLE_VALUE)
{
    while( FindNextFile( // blabla ) )
    {

    }
}
I think it's about time we voted for senators with breasts. After all, we've been voting for boobs long enough. ~Clarie Sargent, Arizona senatorial candidate
Those who are too smart to engage in politics are punished by being governed by those who are dumber. ~Plato
Reply With Quote  
Join Date: Apr 2008
Posts: 44
Reputation: Cybulski is an unknown quantity at this point 
Rep Power: 1
Solved Threads: 2
Sponsor
Cybulski's Avatar
Cybulski Cybulski is offline Offline
C++ wannabe

Re: Iterator assertion failure. How?

  #3  
May 14th, 2008
Originally Posted by Ancient Dragon View Post
My guess is that neither of those loops will work.
1) how is iter_vsDirectory initialized? You failed to post it.

2) what is the purpose of that first loop with the iterator ? The iterator doesn't appear to be used anywhere within the loop. Adding more strings to the end of the vector might invalidate the iterator.

3) You have to call FindFirstFile() before you can start a loop for FindNextFile(). The FindNextFile() you have code will always fail.

1)
vector<string>::iterator iter_vsDirectory = v_sDirectories.begin();

2)
First loop is meant cycle trough directories. For each directory found in v_sDirectories it will call FindFirstFile, then internal loop to list files/directories inside. In case of dir found, it will append last setion of path to work recirsive in all directories inside one given at start.

If adding objects to vector invalidates iterator - thats not the way vector should work imo.

3)
It is called, before main loop.

There is result of running it:
d:\test\*
iterator: d:\test\*
.. dir

directory1 dir
Pushed back to dir vector: directory1\*

directory2 dir
Pushed back to dir vector: directory2\*

file1.txt file
file2.txt file
Last edited by Ancient Dragon : May 14th, 2008 at 8:22 am. Reason: corrected quote tags
Reply With Quote  
Join Date: Aug 2005
Location: near St Louis, Missouri, USA
Posts: 10,561
Reputation: Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of 
Rep Power: 36
Solved Threads: 860
Moderator
Featured Poster
Ancient Dragon's Avatar
Ancient Dragon Ancient Dragon is offline Offline
Most Valuable Poster

Re: Iterator assertion failure. How?

  #4  
May 14th, 2008
From what you said in 2) you apparently did not post all the code. If that is correct then I suspect the problem is the iterator is getting invalidated when a new string is put into the vector.

If you are attempting to build a list of directory and their subdirectory names then maybe using recursion would be a better approach. Here is an example program how to do that. It gets all the file names as well, but you can easily modify the code to do what you want with it.
Last edited by Ancient Dragon : May 14th, 2008 at 8:28 am.
I think it's about time we voted for senators with breasts. After all, we've been voting for boobs long enough. ~Clarie Sargent, Arizona senatorial candidate
Those who are too smart to engage in politics are punished by being governed by those who are dumber. ~Plato
Reply With Quote  
Join Date: Apr 2008
Posts: 44
Reputation: Cybulski is an unknown quantity at this point 
Rep Power: 1
Solved Threads: 2
Sponsor
Cybulski's Avatar
Cybulski Cybulski is offline Offline
C++ wannabe

Re: Iterator assertion failure. How?

  #5  
May 14th, 2008
Thank you very much mr. Ancient Dragon. Your code looks very nice and reusable. Will use these ideas in my solution.

[edit]
Anyway I'll think about it some more, inserting elements shouldn't invalidate iterator.
Last edited by Cybulski : May 14th, 2008 at 8:48 am.
Reply With Quote  
Join Date: Apr 2008
Posts: 44
Reputation: Cybulski is an unknown quantity at this point 
Rep Power: 1
Solved Threads: 2
Sponsor
Cybulski's Avatar
Cybulski Cybulski is offline Offline
C++ wannabe

Re: Iterator assertion failure. How?

  #6  
May 16th, 2008
Ok, here is my solution:

  1. int DirectoryReader::MakeList(string p_sPath)
  2. {
  3. cout << "Parameter: " << p_sPath << endl;
  4. struct _finddatai64_t struct_filedata;
  5. string s_filename = p_sPath + "\\*.*";
  6. string s_current = ".";
  7. string s_parrent = "..";
  8.  
  9. cout << "Listing " << s_filename << endl;
  10.  
  11. long nHandle = _findfirsti64(s_filename.c_str(), &struct_filedata);
  12. if(nHandle >= 0)
  13. {
  14. while(_findnexti64(nHandle, &struct_filedata) == 0)
  15. {
  16. if(struct_filedata.attrib & _A_SUBDIR)
  17. {
  18. if( (s_current.compare(struct_filedata.name) && s_parrent.compare(struct_filedata.name)) )
  19. {
  20. s_filename = p_sPath + "\\" + struct_filedata.name;
  21. cout << "Subdir found: " << s_filename << endl;
  22. MakeList(s_filename);
  23. }
  24. else
  25. {
  26. cout << "Dir found: " << struct_filedata.name << endl;
  27. }
  28. }
  29. else
  30. {
  31. cout << "File found: " << struct_filedata.name << endl;
  32. m_vFilenames.push_back(struct_filedata.name);
  33. }
  34.  
  35. }
  36. }
  37. else
  38. {
  39. cout << "Path not found." << endl;
  40. return -1;
  41. }
  42.  
  43.  
  44. return 1;
  45. }

Two things bother me:
1) strcmp() don't want take data.name as first parameter,
2) "." should be found and displayed, but it isn't.

It works well besides that.
Last edited by Cybulski : May 16th, 2008 at 8:48 am.
Reply With Quote  
Join Date: Aug 2005
Location: near St Louis, Missouri, USA
Posts: 10,561
Reputation: Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of 
Rep Power: 36
Solved Threads: 860
Moderator
Featured Poster
Ancient Dragon's Avatar
Ancient Dragon Ancient Dragon is offline Offline
Most Valuable Poster

Re: Iterator assertion failure. How?

  #7  
May 16th, 2008
you must have something else wrong because your function compiled ok for me. All I did was make it a simple function and declare the vector globally.

#include <iostream>
#include <string>
#include <io.h>
#include <vector>
using namespace std;

vector<string> m_vFilenames;
int MakeList(string p_sPath)
{
	cout << "Parameter: " << p_sPath << endl;
	struct _finddatai64_t struct_filedata;
	string s_filename = p_sPath + "\\*.*";
	string s_current = ".";
	string s_parrent = "..";
	
	cout << "Listing " << s_filename << endl;

	long nHandle = _findfirsti64(s_filename.c_str(), &struct_filedata);
	if(nHandle >= 0)
	{
		while(_findnexti64(nHandle, &struct_filedata) == 0)
		{
			if(struct_filedata.attrib & _A_SUBDIR)
			{
				if( (s_current.compare(struct_filedata.name) && s_parrent.compare(struct_filedata.name)) )
				{
					s_filename = p_sPath + "\\" + struct_filedata.name;
					cout << "Subdir found: " << s_filename << endl;
					MakeList(s_filename);
				}
				else
				{
					cout << "Dir found: "  << struct_filedata.name << endl;
				}
			}
			else
			{
				cout << "File found: " << struct_filedata.name << endl;
				m_vFilenames.push_back(struct_filedata.name);
			}
			
		}
	}
	else
	{
		cout << "Path not found." << endl;
		return -1;
	}


	return 1;
}

int main()
{

}
I think it's about time we voted for senators with breasts. After all, we've been voting for boobs long enough. ~Clarie Sargent, Arizona senatorial candidate
Those who are too smart to engage in politics are punished by being governed by those who are dumber. ~Plato
Reply With Quote  
Join Date: Apr 2008
Posts: 44
Reputation: Cybulski is an unknown quantity at this point 
Rep Power: 1
Solved Threads: 2
Sponsor
Cybulski's Avatar
Cybulski Cybulski is offline Offline
C++ wannabe

Re: Iterator assertion failure. How?

  #8  
May 16th, 2008
yes, it compiles and works ok, but this:
if( (s_current.compare(struct_filedata.name) && s_parrent.compare(struct_filedata.name)) )
{
    s_filename = p_sPath + "\\" + struct_filedata.name;
    cout << "Subdir found: " << s_filename << endl;
    MakeList(s_filename);
}
else
{
    cout << "Dir found: "  << struct_filedata.name << endl;
}

Should display:
Dir found: .
Dir found: ..
for every directory. It only does it for "..". Why is that?

And I had to declare additional strings and use string.compare(...) because strcmp() takes no struct_filedata.name as parameter.
Reply With Quote  
Join Date: Aug 2005
Location: near St Louis, Missouri, USA
Posts: 10,561
Reputation: Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of Ancient Dragon has much to be proud of 
Rep Power: 36
Solved Threads: 860
Moderator
Featured Poster
Ancient Dragon's Avatar
Ancient Dragon Ancient Dragon is offline Offline
Most Valuable Poster

Re: Iterator assertion failure. How?

  #9  
May 16th, 2008
>>if( (s_current.compare(struct_filedata.name) && s_parrent.compare(struct_filedata.name)) )

use || operator instead of && because it can't be both at the same time.
I think it's about time we voted for senators with breasts. After all, we've been voting for boobs long enough. ~Clarie Sargent, Arizona senatorial candidate
Those who are too smart to engage in politics are punished by being governed by those who are dumber. ~Plato
Reply With Quote  
Join Date: Apr 2008
Posts: 44
Reputation: Cybulski is an unknown quantity at this point 
Rep Power: 1
Solved Threads: 2
Sponsor
Cybulski's Avatar
Cybulski Cybulski is offline Offline
C++ wannabe

Re: Iterator assertion failure. How?

  #10  
May 17th, 2008
Originally Posted by Ancient Dragon View Post
>>if( (s_current.compare(struct_filedata.name) && s_parrent.compare(struct_filedata.name)) )

use || operator instead of && because it can't be both at the same time.


Nope, not working. Negating whole condition not working also. Only way to get list of files is using && operator, and my brain is melting while thinking why.
Reply With Quote  
Reply

Only community members can participate in forum threads. You must register or log in to contribute.

Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)

 

DaniWeb C++ Marketplace
Thread Tools Display Modes

Similar Threads
Other Threads in the C++ Forum

All times are GMT -4. The time now is 11:22 am.
Forum system based on vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
©2003 - 2008 DaniWeb® LLC