我有一个名为num.txtwho的唯一内容就是该行的文本文件123.然后我有以下内容:
void alt_reader(ifstream &file, char* line){
file.read(line, 3);
cout << "First Time: " << line << endl;
}
int main() {
ifstream inFile;
int num;
inFile.open("num.txt");
alt_reader(inFile, (char*)&num);
cout << "Second Time: " << num << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
First Time: 123
Second Time: 3355185
Run Code Online (Sandbox Code Playgroud)
你能帮我弄清楚如何获得一个在函数中读取的fstream仍然在main中分配变量吗?我这样做是因为alt_reader真的有更多,但这是我坚持的部分.非常感谢您的帮助.
更新:使用比尔奥纳尔的评论,我写了
void alt_reader(ifstream &file, stringstream &str, int n){
char buffer[n+1];
file.read(buffer, n);
buffer[n] = 0;
str << buffer;
cout << "First Time: " << buffer << endl; //First …Run Code Online (Sandbox Code Playgroud) std::getline当它获得一个时抛出异常eof.这就是我的表现.
std::ifstream stream;
stream.exceptions(std::ifstream::failbit|std::ifstream::badbit);
try{
stream.open(_file.c_str(), std::ios_base::in);
}catch(std::ifstream::failure e){
std::cout << "Failed to open file " << _file.c_str() << " for reading" << std::endl;
}
while(!stream.eof()){
std::string buffer = "";
std::getline(stream, buffer);
//process buffer
//I do also need to maintain state while parsing
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码getline中抛出异常,因为它获得了eof
如何处理这种情况?
std::string buffer = "";
while(std::getline(stream, buffer)){
//also causes getline to hit eof and throw
}
Run Code Online (Sandbox Code Playgroud) 作者在标题下提出了这段代码A bus error on my platform
#include <fstream>
#include <iostream>
int main()
{
std::ofstream log("oops.log");
std::cout.rdbuf(log.rdbuf());
std::cout << "Oops!\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
字符串"Oops!\n"将打印到文件"oops.log".代码不会恢复cout的streambuf,但VS2010没有报告运行时错误.
这个问题:如何保护日志免受应用程序崩溃?引导我到另一个 - std::ofstream::close()实际上做了什么?我知道它的召唤flush(),这是一回事.但还有什么?实际关闭文件的是什么?
编辑:让我重新解释一下我的问题 - 在调用过程中对实际文件做了什么实际操作,close()还是只是std::ofstream内部清理?
我想vector<string通过使用其范围构造函数将文本文件中的所有行加载到a中,然后通过cout以下方式输出:
#include<iostream>
#include<fstream>
#include<vector>
#include<iterator>
using namespace std;
int main()
{
ifstream file("file.txt");
vector<string> strings(istream_iterator<string>(file) , istream_iterator<string>());
for(auto s : strings)
cout << s << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在尝试编译上面的代码时,我得到了几个错误,例如:
error: no matching function for call to ‘begin(std::vector<std::basic_string<char> > (&) (std::istream_iterator<std::basic_string<char> >, std::istream_iterator<std::basic_string<char> > (*) ()))’
for(auto s : strings)
^
Run Code Online (Sandbox Code Playgroud)
还有其他几个......
我想我在这里遗漏了一些明显的东西,有人可以帮忙吗?
我想读取并从txt文件中删除第一行(没有复制,这是一个巨大的文件).
我已经阅读了网络,但每个人都只是将所需的内容复制到一个新文件中.我做不到.
低于第一次尝试.由于没有删除行,此代码将被置于循环中.如果代码将在每个开头删除第一行文件,代码将到达结尾.
#include <iostream>
#include <string>
#include <fstream>
#include <boost/interprocess/sync/file_lock.hpp>
int main() {
std::string line;
std::fstream file;
boost::interprocess::file_lock lock("test.lock");
while (true) {
std::cout << "locking\n";
lock.lock();
file.open("test.txt", std::fstream::in|std::fstream::out);
if (!file.is_open()) {
std::cout << "can't open file\n";
file.close();
lock.unlock();
break;
}
else if (!std::getline(file,line)) {
std::cout << "empty file\n"; //
file.close(); // never
lock.unlock(); // reached
break; //
}
else {
// remove first line
file.close();
lock.unlock();
// do something with line
}
}
}
Run Code Online (Sandbox Code Playgroud) 我需要使用一些 C++ 代码来读取制表符分隔的文本文件。该文件包含三列,第二列包含带空格的字符串。以下是该文件的一些示例。
1 hellow world uid_1
2 good morning uid_2
Run Code Online (Sandbox Code Playgroud)
以下是我需要用来读取文件的C++。但是,当遇到字符串中的空格时,它无法正确读取文件。
关于修改 while 循环以使其工作有什么建议吗?我对 C++ 不熟悉。请提供详细代码。谢谢!
#include <Rcpp.h>
#include <iostream>
#include <fstream>
#include <string>
std::ifstream infile (file_name.c_str());
int row = -1;
std::string col;
std::string uid;
while (infile >> row >> col >> uid) {
### operations on row, col and uid ####
}
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个项目,我有一个大文本文件(15+ GB),我正在尝试在文件的每一行上运行一个函数.为了加快任务速度,我创建了4个线程并试图让它们同时读取文件.这与我的相似:
#include <stdio.h>
#include <string>
#include <iostream>
#include <stdlib.h>
#include <thread>
#include <fstream>
void simpleFunction(*wordlist){
string word;
getline(*wordlist, word);
cout << word << endl;
}
int main(){
int max_concurrant_threads = 4;
ifstream wordlist("filename.txt");
thread all_threads[max_concurrant_threads];
for(int i = 0; i < max_concurrant_threads; i++){
all_threads[i] = thread(simpleFunction,&wordlist);
}
for (int i = 0; i < max_concurrant_threads; ++i) {
all_threads[i].join();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
getline函数(以及"*wordlist >> word")似乎会增加指针并以2个步骤读取值,因为我会经常得到:
Run Code Online (Sandbox Code Playgroud)Item1 Item2 Item3 Item2
背部.
所以我想知道是否有办法原子地读取文件的一行?首先将它加载到数组中是行不通的,因为文件太大了,我不希望一次加载文件.
我遗憾地找不到关于fstream和getline原子性的任何内容.如果有一个原子版的readline甚至是一个简单的方法来使用锁来实现我想要的东西,我全都耳朵.
提前致谢!
此C++代码旨在将文件中的数据从67~69移动到70~72:
#include <fstream>
#include <iostream>
int main() {
std::fstream file("test", std::ios::out);
file.close();
file.open("test", std::ios::binary | std::ios::in | std::ios::out);
for (char i = 0; i < 127; ++i)
file.write(&i, 1);
file.seekp(70);
file.seekp(-3, std::ios::cur);
char s[100];
for (int i = 0; i < 100; ++i)
s[i] = '\0';
file.read(s, 3);
for (int i = 0; i < 3; ++i)
std::cout << (int)s[i] << " ";
std::cout << std::endl;
file.write(s, 3);
file.seekp(-3, std::ios::cur);
file.read(s, 3);
for (int i = 0; i < 3; …Run Code Online (Sandbox Code Playgroud) 如果文件无法打开,我应该关闭吗?
我应该写这个:
std::ifstream file(DATA_PATH);
if (!file.good()) //File doesn't exist
{
//do something
}
else //file exists
{
//do something
file.close();
}
Run Code Online (Sandbox Code Playgroud)
或者我应该写:
std::ifstream file(DATA_PATH);
if (!file.good()) //File doesn't exist
{
//do something
}
else //file exists
{
//do something
}
file.close();
Run Code Online (Sandbox Code Playgroud)