Reputation: 151
I am writing a program in C++. One part of it is this:
std::wcout << "\nEnter path to seed file: ";
char Seed_File_Path[255];//Array for the user to enter a file path
std::cin >> Seed_File_Path;
FILE *seed_file_ifp; //Creates pointer to FCB for the seed file.
seed_file_ifp = fopen(Seed_File_Path, "r"); //opens the file input stream with read permissions.
while (seed_file_ifp == NULL) {//Checks that file was found.
std::wcout << "\nFile not found. Enter a valid path and make sure file exists.\n\n";
std::wcout << "\nEnter path to seed file: ";
std::cin >> Seed_File_Path;
seed_file_ifp = fopen(Seed_File_Path, "r");
}//Ends if ifp successful
I can enter a path less than the size of the array, and the program works as expected. My question is, why does fopen
read my path correctly? I would expect it to read in every character in the array, but it reads only what I enter and not past that.
Another characteristic I noticed was that I can enter a large sequence of characters that aren't a valid path (for example, rrrrrr...), then, after the program lets me input a path again, I can enter a smaller sequence of characters that does lead to a valid path (for example, "C:\file.txt"
) and fopen
is able to use the valid path "correctly". However, I would expect it to use as a string all the characters in the array, which include the valid path plus other, previously entered stuff.
I would like to know the characteristic(s) of an array that cause it to work "correctly," and whether that's a good thing or bad.
Upvotes: 0
Views: 795
Reputation: 441
When you "enter" your string with cin it automatically adds a '\0' at the n+1 element of the string (n being the size of your string). String operated functions like cout or fopen will only read up to that point. To test this theory you can enter a string 10 characters long, say, and then manually change the 11'th character to something else. Then manually add a '\0' at say the 20th character and print out the string. You'll get a 20 char string with the chars from 10 to 20 being any gibberish.
Upvotes: 6
Reputation: 9173
fopen()
uses c-string which by definition is a list characters ending to \0
or NULL
. It does not use array length.
When you read path using cin
, it automatically adds a \0
character at end of data. So when you try to open it with fopen()
you only read it till there and ignore any other character after that \0
.
Upvotes: 2