C++从TXT读取文件名后调用MoveFile失效,直接传参正常,原因何在?
问题:C++拼接路径调用MoveFile失败,直接传常量字符串正常?
我正在编写一个简单的C++程序,功能是从TXT文件中读取文件名,将对应文件从指定源路径移动到指定目标路径,但程序无法正常运行。目前我的代码如下:
using namespace std; int main(void) { // Checking periodically if a new file exists and moving it // First, obtain the latest file name from the log. This will be the last line of the file "test1.txt" . ifstream MyFile; std::string LastLine; int NumLines = 0; MyFile.open("C:\\Users\\guili\\Desktop\\test folder\\test1.txt"); if (MyFile.is_open()) { while (getline(MyFile, LastLine)) { } } MyFile.close(); // Move this file from "test folder" to "test folder2": std::string SourcePath = "C:/Users/guili/Desktop/test folder/"; std::string DestinationPath = "C:/Users/guili/Desktop/test folder2/"; std::string FileToBeMoved = SourcePath + LastLine ; std::string FileMovedTo = DestinationPath + LastLine; MoveFile(FileToBeMoved.c_str(), FileMovedTo.c_str()); return 0; }
不过,如果我直接使用如下代码调用MoveFile,程序就能正常工作:
MoveFile("C:/Users/guili/Desktop/test folder/test2.txt", "C:/Users/guili/Desktop/test folder 2/test2.txt");
请问这是否与MoveFile函数的格式要求有关?
解决分析
这大概率不是MoveFile的格式要求问题,而是你从文件读取的LastLine字符串可能包含多余的换行符、回车符或者空格,导致拼接后的路径不符合实际文件路径。
具体问题点:
getline读取每行时,会把换行符(\n)或者回车+换行(\r\n)从输入中剔除,但如果你的test1.txt最后一行存在多余的空白字符(比如末尾的空格、换行残留),LastLine就会带上这些无效字符。- 直接写常量字符串时路径是完全精确的,没有多余字符,所以
MoveFile能正常识别路径。
解决方法:
- 清理读取到的文件名:在拼接路径前,去掉
LastLine中的空白字符(包括换行、回车、空格):
// 去除字符串首尾的空白字符 size_t start = LastLine.find_first_not_of(" \t\n\r"); size_t end = LastLine.find_last_not_of(" \t\n\r"); if (start != string::npos && end != string::npos) { LastLine = LastLine.substr(start, end - start + 1); } else { // 处理空行情况,比如直接返回或者报错 return 1; }
- 完善文件读取的错误处理:当前代码没有判断
test1.txt是否成功打开,也没处理文件为空的情况,建议补充:
if (!MyFile.is_open()) { cerr << "无法打开文件test1.txt" << endl; return 1; } // 读取后检查LastLine是否为空 if (LastLine.empty()) { cerr << "文件test1.txt中没有有效文件名" << endl; return 1; }
- 检查MoveFile的返回值:
MoveFile会返回BOOL类型值,通过返回值可以判断移动是否成功,方便排查问题:
BOOL result = MoveFile(FileToBeMoved.c_str(), FileMovedTo.c_str()); if (!result) { // 获取错误码,打印具体错误 DWORD error = GetLastError(); cerr << "移动文件失败,错误码:" << error << endl; }
额外提示:
Windows下的路径可以使用正斜杠/或者双反斜杠\\,两种格式MoveFile都能识别,所以路径分隔符不是问题。
内容的提问来源于stack exchange,提问作者gui1303
相关产品推荐
相关产品推荐

