我正在用C ++编写程序。其中一部分是:
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
我可以输入小于数组大小的路径,程序按预期工作。我的问题是,为什么fopen
正确地读了我的路径?我希望它能读入数组中的每个字符,但它只读取我输入的内容,而不是读取内容。
我注意到的另一个特点是我可以输入一大段不是有效路径的字符(例如,rrrrrr ...),然后,在程序让我再次输入路径后,我可以输入一个导致有效路径的较小字符序列(例如,"C:\file.txt"
)和fopen
能够“正确”使用有效路径。但是,我希望它能够将数组中的所有字符用作字符串,其中包括有效路径以及之前输入的其他内容。
我想知道数组的特性,使其“正确”工作,以及这是好事还是坏事。
答案 0 :(得分:6)
当您使用cin“输入”字符串时,它会自动在字符串的n + 1元素处添加'\ 0'(n是字符串的大小)。像cout或fopen这样的字符串操作函数只能读取到那一点。要测试这个理论,你可以输入一个长10个字符的字符串,然后手动将第11个字符更改为其他字符。然后在第20个字符处手动添加'\ 0'并打印出字符串。你会得到一个20字符串,字符从10到20是任何乱码。
答案 1 :(得分:2)
fopen()
使用c-string,根据定义,该字符串是以\0
或NULL
结尾的列表字符。它不使用数组长度。
使用cin
读取路径时,它会在数据末尾自动添加\0
个字符。因此,当您尝试使用fopen()
打开它时,您只能阅读它并忽略其后的任何其他字符\0
。