Ok so this is really annoying me...I'm trying to go through and parse a bunch of .csv files for content but I can't get past trying to open them.

I want to read the directory contents and then open the specified file. I have the code working so it prints the directory contents successfully but when it tries to open the file it can only open the first 4 and then fails on the rest. If I hard code the filenames of the files it "FAILS" on (i.e. inFile.open("filename.txt")) it works just fine.

Any suggestions? Oh and I did try reading the entries from a list.txt but I can't get that to work either. My guess is the null character or something is interfering with the attempt to open it but I can't figure out how to work around that...I can do it in perl just not C++ :(

#include <iomanip>
#include <iostream>
#include <dirent.h>
#include <fstream>
#include <string>

using namespace std;

int main()
{
   DIR *dirp;
   struct dirent *entry;
   int pos;
   int linecount = 0;

   if(dirp = opendir("C:\\csvfiles\\"))
   {
      while(entry = readdir(dirp))
      {
         //printf("%s\n", entry->d_name);  //prints the files in the directory
         string temp = entry->d_name;
         if (temp.length() > 2)    //skips over the . and .. entries
         {
            ifstream inFile;           //creates a fstream object inFile
            inFile.open(entry->d_name);    //opens the file
            if (!inFile.is_open())                 //if file wasn't opened
            {
               cout << "Failed to open " << entry->d_name << endl;
               // return 1;
            }
            else 
            {
               cout << "Successfully opened " << entry->d_name << endl;
             }
             inFile.clear();
             inFile.close();    
         }  //end of while file exists
      }
      closedir(dirp);
   }     
   return EXIT_SUCCESS;
}

This is my output...

C:\bom\Debug>bom.exe
Successfully opened 5A40 Combo.csv
Successfully opened 5A40 Head.csv
Successfully opened 5A80 Combo.csv
Successfully opened 5A80 Head.csv
Failed to open 5C1.csv
Failed to open 5C1A.csv
Failed to open 5C1x2.csv
Failed to open 5C3.csv
Failed to open 5C3P.csv
Failed to open 5C5.csv
Failed to open 5E3 Head.csv
Failed to open 5E3.csv

fails = can't open the file. eventually i need to parse the file looking for specific information but i'm stuck since i can't actually open it. the only other way i've found is to hardcode the files into a static const char array...but there are 90 some files so that's not practical. i should be fine once i can get the files to open.

i just don't understand why 4 open correctly and the rest won't...

#include <iomanip>
#include <iostream>
#include <dirent.h>
#include <fstream>
#include <string>

using namespace std;

int main()
{
   DIR *dirp;
   struct dirent *entry;
   int pos;
   int linecount = 0;

   if(dirp = opendir("C:\\csvfiles\\"))
   {
      while(entry = readdir(dirp))
      {
         //printf("%s\n", entry->d_name);  //prints the files in the directory
         string temp = entry->d_name;
         temp = "C:\\csvfiles\\" + temp;
         if (temp.length() > 2)    //skips over the . and .. entries
         {
            ifstream inFile;           //creates a fstream object inFile
            inFile.open(temp.c_str());    //opens the file
            if (!inFile.is_open())                 //if file wasn't opened
            {
               cout << "Failed to open " << entry->d_name << endl;
               // return 1;
            }
            else 
            {
               cout << "Successfully opened " << entry->d_name << endl;
             }
             inFile.clear();
             inFile.close();    
         }  //end of while file exists
      }
      closedir(dirp);
   }
   
   system("pause");     
   return EXIT_SUCCESS;
}

untested

it worked :) yay thanks! I guess I just needed to specify the entire path since I had variations of what you changed before (without the full path).

Thanks :)

so just curious...any idea why it would work for some and not all? i mean the code works now but i'm still a bit curious why it didn't work for everything.

so just curious...any idea why it would work for some and not all? i mean the code works now but i'm still a bit curious why it didn't work for everything.

The reason why it worked on some is that you must have these files:

Successfully opened 5A40 Combo.csv
Successfully opened 5A40 Head.csv
Successfully opened 5A80 Combo.csv
Successfully opened 5A80 Head.csv

within your debug folder? I'm guessing.

Ok now I feel REALLY dumb... you were right, those files were in my debug folder. Thanks again. :)

No probs sometimes you hit a brick wall and you miss the obvious.

You might wanna look into why I had to use c_str() for reading in the paths...

yeah I had discovered I had to use c_str() a while back but when i tried opening using inFile.open(temp.c_str())...but it didn't work (since i wasn't specifying the full path). i at least got error messages with temp.c_str() vs the compile error just using temp.

and for those who might wander across this thread....the method 'c_str()' will return a pointer to a null-terminated representation of the std::string's content.

anyways thanks again!

This question has already been answered. Start a new discussion instead.