我一直在编写一个C ++程序,最终会从文本文件中删除某些不需要的格式。不幸的是,我还没有达到这个目标。
我目前的问题是我似乎无法打开位于给定(用户输入的)目录中的文本文件。这是我到目前为止的地方,剥夺了最不需要的批量:
//header, main function, bulk
//variable definitions
FILE * pFile;
//char filePathBuffer [512]; --unused, from older attempts
string currentLine = "", command = "", commandList = "ct", filePath = "defaultPath";
int quotePos = 0, slashPos = 0, bufferLength = 0;
bool contQuote = true, contSlash = true;
cout << "> ";
getline(cin, command);
//various exit commands
while(command != "q" && command != "quit" && command != "exit") {
//check for valid commands stored in a string
//--definitely not the best way to do it, but it's functional
if(commandList.find(command) == commandList.npos) {
puts("\nPlease enter a valid command.\n");
}
else if(command == "t") {
puts("\nPlease enter the file path:\n");
cout << "> ";
getline(cin, filePath);
//rip all quotes out of the entered file path
while(contQuote == true) {
quotePos = filePath.find("\"");
if(quotePos == filePath.npos)
contQuote = false;
else
filePath.erase(quotePos, 1);
}
pFile = fopen(filePath.c_str(), "r+");
//I've also tried doing countless variations directly in the code,
//as opposed to using user-input. No luck.
//pFile = fopen("C:\\test.txt", "r+");
if(pFile!=NULL) {
cout << "\nFile opened!" << endl << endl;
fclose (pFile);
}
else
cerr << "\nFile failed to open!\n\n";
}
//reset variables to default values
quotePos = -1;
slashPos = -1;
contQuote = true;
contSlash = true;
cout << "> ";
getline(cin, command);
}
我真的不确定输入字符串是否应该有引号 - 我无法让它们以任何方式工作。我还尝试使用filePath.find('\\')来查找反斜杠(这样我就可以在filePath中添加第二个反斜杠以进行正确的解析),但最后没有运气。
你们有什么想法可以解决这种情况吗?
谢谢!
答案 0 :(得分:1)
我猜你是从\\
来判断窗口。
尝试此功能:
#include <windows.h>
bool fileExist(const std::string& fileName_in)
{
DWORD ftyp = GetFileAttributesA(fileName_in.c_str());
if (ftyp == INVALID_FILE_ATTRIBUTES)
return false;
if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
return false; // this is a directory
return true; // this is a normal file
}
尝试使用此功能的输入字符串。如果它返回false告诉你的用户他是盲人:)
答案 1 :(得分:1)
我建议您在调用fopen时查看filePath包含的内容。然后你就能看到出了什么问题。
两种方法:
在调用fopen之前打印出值
使用调试器,在fopen调用上放置断点并检查文件路径的内容
答案 2 :(得分:0)
看起来像是权限问题。你有没有尝试过其他子目录?我添加了一些代码来检查fopen()返回时的errno值 - 注意下面的“Permission Denied”:
> t
Please enter the file path:
> .\test.cpp
File opened!
> t
Please enter the file path:
> c:\setup.log
File failed to open with error: Permission denied
> t
Please enter the file path:
> c:\cygwin\cygwin.bat
File opened!
>