istream 打开 .txt 文件但实际上没有收集文件中的文本
istream opening .txt file but not actually gathering the text within the file
编辑:已解决。将 ins >> val
移动到循环之前,然后将 ins.fail()
作为条件。我不完全确定为什么这有帮助,但确实有帮助,我很乐意继续前进。
原文post:
下面的代码有问题。出于某种原因,它读取 file.txt
并返回正常,但 istream 正在读取输入,就好像文件是空白的一样。作为参考,我在 Xcode 工作。我试过玩弄这个计划,但似乎没有任何效果。我只是不明白它是如何成功读取文件的(我 运行 检查了一些 ...
代码,它说文件已成功打开)但还没有拉入任何输入。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream inFile;
inFile.open("file.txt");
// There exists a class called Position that isn't important for
// this but just clarifying
Position pos;
pos.read(inFile);
return 0;
}
void Position::read(istream& ins) {
int val;
char discard;
while (!(ins >> val)) {
ins.clear();
ins >> discard;
}
}
我对此比较陌生,现在只编写了大约 6 个月的代码。我将不胜感激任何解释。谢谢大家!
编辑:此代码的目的是以整数形式从文件中提取输入。如果输入不是 int
,循环将重置为良好状态并将非整数作为 char
拉入。我不太关心文件的实际文本似乎消失了这一事实。提供代码主要是为了提供一些上下文。
抱歉我对 Stack 不熟悉!
edit2:如果我 运行 循环是这样的:
while (!(ins >> val)) {
ins.clear();
ins >> discard;
cout << discard;
}
它进入了一个无限循环,因为没有来自文件的输入。
不确定我将如何显示 I/O 因为问题是没有任何输入,因此没有输出。当我测试时,它只是 运行s 和 运行s 和 运行s 直到我停止它。实际的 .txt 文件不是空的,但它以某种方式被视为空的。
edit3:添加更多行以尝试澄清到底发生了什么。
再次感谢!
这是一个简短的例子,显示:
- 如何读取文件中的行
- 如何检查文件结尾
- 如何写入文件
- 如何附加到已存在的文件
我希望它能澄清一些事情。这个问题有点难以直接回答,因为你从来没有解释 ins
是什么。
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using std::string;
using std::ifstream;
using std::ofstream;
using std::vector;
void append_to_file(string const& filename, string const& text)
{
// Open the file in append mode
ofstream file(filename, std::ios_base::app);
// Write the text to the file
file << text;
}
void write_to_file(string const& filename, string const& text)
{
// Clear the file and open it
ofstream file(filename);
file << text;
}
// Read all the lines in the file
vector<string> read_all_lines(string const& filename)
{
ifstream file(filename);
vector<string> lines;
while(not file.eof() && not file.fail()) {
// Get the line
std::string line;
std::getline(file, line);
// Add the line into the vector
lines.push_back(std::move(line));
}
return lines;
}
int main()
{
string filename = "test-file.txt";
// Clear the file and write
write_to_file(filename, "This is a sentence.\n");
// Append some additional text to the file:
append_to_file(filename, "This is some additional text");
// Read all the lines in the file we wrote:
vector<string> lines = read_all_lines(filename);
// Print the lines we read:
for(auto& line : lines) {
std::cout << line << '\n';
}
}
编辑:已解决。将 ins >> val
移动到循环之前,然后将 ins.fail()
作为条件。我不完全确定为什么这有帮助,但确实有帮助,我很乐意继续前进。
原文post:
下面的代码有问题。出于某种原因,它读取 file.txt
并返回正常,但 istream 正在读取输入,就好像文件是空白的一样。作为参考,我在 Xcode 工作。我试过玩弄这个计划,但似乎没有任何效果。我只是不明白它是如何成功读取文件的(我 运行 检查了一些 ...
代码,它说文件已成功打开)但还没有拉入任何输入。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream inFile;
inFile.open("file.txt");
// There exists a class called Position that isn't important for
// this but just clarifying
Position pos;
pos.read(inFile);
return 0;
}
void Position::read(istream& ins) {
int val;
char discard;
while (!(ins >> val)) {
ins.clear();
ins >> discard;
}
}
我对此比较陌生,现在只编写了大约 6 个月的代码。我将不胜感激任何解释。谢谢大家!
编辑:此代码的目的是以整数形式从文件中提取输入。如果输入不是 int
,循环将重置为良好状态并将非整数作为 char
拉入。我不太关心文件的实际文本似乎消失了这一事实。提供代码主要是为了提供一些上下文。
抱歉我对 Stack 不熟悉!
edit2:如果我 运行 循环是这样的:
while (!(ins >> val)) {
ins.clear();
ins >> discard;
cout << discard;
}
它进入了一个无限循环,因为没有来自文件的输入。 不确定我将如何显示 I/O 因为问题是没有任何输入,因此没有输出。当我测试时,它只是 运行s 和 运行s 和 运行s 直到我停止它。实际的 .txt 文件不是空的,但它以某种方式被视为空的。
edit3:添加更多行以尝试澄清到底发生了什么。
再次感谢!
这是一个简短的例子,显示:
- 如何读取文件中的行
- 如何检查文件结尾
- 如何写入文件
- 如何附加到已存在的文件
我希望它能澄清一些事情。这个问题有点难以直接回答,因为你从来没有解释 ins
是什么。
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using std::string;
using std::ifstream;
using std::ofstream;
using std::vector;
void append_to_file(string const& filename, string const& text)
{
// Open the file in append mode
ofstream file(filename, std::ios_base::app);
// Write the text to the file
file << text;
}
void write_to_file(string const& filename, string const& text)
{
// Clear the file and open it
ofstream file(filename);
file << text;
}
// Read all the lines in the file
vector<string> read_all_lines(string const& filename)
{
ifstream file(filename);
vector<string> lines;
while(not file.eof() && not file.fail()) {
// Get the line
std::string line;
std::getline(file, line);
// Add the line into the vector
lines.push_back(std::move(line));
}
return lines;
}
int main()
{
string filename = "test-file.txt";
// Clear the file and write
write_to_file(filename, "This is a sentence.\n");
// Append some additional text to the file:
append_to_file(filename, "This is some additional text");
// Read all the lines in the file we wrote:
vector<string> lines = read_all_lines(filename);
// Print the lines we read:
for(auto& line : lines) {
std::cout << line << '\n';
}
}