getline(file, text) 表现出奇怪的行为:卡在阅读幽灵行
getline(file, text) exhibits strange behavior : stuck reading a ghost line
我对 getline 在以下代码中表现出的奇怪行为感到困惑
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main() {
string password = "cat";
string inputFileName = "text.txt";
string content = "";
ifstream file;
file.open(inputFileName);
if(file.fail()) {
cout << "error opening the file" << endl;
}
getline(file, content);
file.close();
cout << "The content of the file is: " << content << endl;
}
文件text.txt
的内容原本是一行:"This is a generic text to be encrypted"
,被正确复制到字符串content
.
每当我更改文件中的文本或删除其内容、保存它并再次 运行 程序时,相同的旧字符串总是被复制到文本字符串变量中。更奇怪的是,即使删除文件,也不会抛出任何错误,被删除的文件仍然被打开并且 getline(file, text)
仍然将相同的字符串分配给文本,如调试器和打印语句所示。
这是怎么回事?
这应该是一个简单的学习练习。如果对我在 Windows 10 上使用 qtcreator 有帮助,给我的 Cmake 文件具有以下内容:
cmake_minimum_required(VERSION 3.5)
project(encryption LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(encryption main.cpp)
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/text.txt
DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
显然,您的程序并非 运行来自您认为的目录。
我发现 Visual Studio 在这方面特别糟糕。您需要进入项目的属性并查看当前目录设置的位置。或者 运行 自己从终端上获取。
编辑您能找到的该文本文件的每个副本,并使每个副本都独一无二,然后您将看到正在使用的是哪个。
同样重要的是要知道,在执行 cmake 时,CMake 只会 运行 一次执行这些文件复制操作。不是每次构建项目时。您可以安排这样做,但这将是一个自定义目标,而不是文件(复制)操作。
除了重复文件问题,另一个明显的问题是只输出消息:
cout << "error opening the file" << endl;
不会使程序不执行以下行,如果文件未正确打开,您需要停止执行处理文件的其余代码。
示例:
if (file.fail()) // IMO prefer if(!file.is_open())
{
cout << "error opening the file" << endl;
}
else
{
getline(file, content);
file.close();
cout << "The content of the file is: " << content << endl;
}
我对 getline 在以下代码中表现出的奇怪行为感到困惑
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main() {
string password = "cat";
string inputFileName = "text.txt";
string content = "";
ifstream file;
file.open(inputFileName);
if(file.fail()) {
cout << "error opening the file" << endl;
}
getline(file, content);
file.close();
cout << "The content of the file is: " << content << endl;
}
文件text.txt
的内容原本是一行:"This is a generic text to be encrypted"
,被正确复制到字符串content
.
每当我更改文件中的文本或删除其内容、保存它并再次 运行 程序时,相同的旧字符串总是被复制到文本字符串变量中。更奇怪的是,即使删除文件,也不会抛出任何错误,被删除的文件仍然被打开并且 getline(file, text)
仍然将相同的字符串分配给文本,如调试器和打印语句所示。
这是怎么回事?
这应该是一个简单的学习练习。如果对我在 Windows 10 上使用 qtcreator 有帮助,给我的 Cmake 文件具有以下内容:
cmake_minimum_required(VERSION 3.5)
project(encryption LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(encryption main.cpp)
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/text.txt
DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
显然,您的程序并非 运行来自您认为的目录。
我发现Visual Studio 在这方面特别糟糕。您需要进入项目的属性并查看当前目录设置的位置。或者 运行 自己从终端上获取。
编辑您能找到的该文本文件的每个副本,并使每个副本都独一无二,然后您将看到正在使用的是哪个。
同样重要的是要知道,在执行 cmake 时,CMake 只会 运行 一次执行这些文件复制操作。不是每次构建项目时。您可以安排这样做,但这将是一个自定义目标,而不是文件(复制)操作。
除了重复文件问题,另一个明显的问题是只输出消息:
cout << "error opening the file" << endl;
不会使程序不执行以下行,如果文件未正确打开,您需要停止执行处理文件的其余代码。
示例:
if (file.fail()) // IMO prefer if(!file.is_open())
{
cout << "error opening the file" << endl;
}
else
{
getline(file, content);
file.close();
cout << "The content of the file is: " << content << endl;
}