标签: fstream

C++新手:将fstream传递给函数以读取数据

我有一个名为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)

c++ fstream function

6
推荐指数
1
解决办法
2万
查看次数

当它击中eof时std :: getline投掷

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)

c++ fstream getline eof

6
推荐指数
1
解决办法
9306
查看次数

如果使用cout.rdbuf()来切换缓冲区并且从不将其设置回来,会出现什么问题?

作者在标题下提出了这段代码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没有报告运行时错误.

c++ fstream streambuf undefined-behavior

6
推荐指数
2
解决办法
962
查看次数

std :: ofstream :: close()实际上做了什么?

这个问题:如何保护日志免受应用程序崩溃?引导我到另一个 - std::ofstream::close()实际上做了什么?我知道它的召唤flush(),这是一回事.但还有什么?实际关闭文件的是什么?

编辑:让我重新解释一下我的问题 - 在调用过程中对实际文件做了什么实际操作,close()还是只是std::ofstream内部清理?

c++ fstream flush

6
推荐指数
2
解决办法
5187
查看次数

如何正确使用向量范围构造函数?

我想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)

还有其他几个......

我想我在这里遗漏了一些明显的东西,有人可以帮忙吗?

c++ fstream vector most-vexing-parse c++11

6
推荐指数
1
解决办法
607
查看次数

从txt文件中读取并删除第一行(或最后一行)而不复制

我想读取并从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++ fstream getline stdstring boost-interprocess

6
推荐指数
2
解决办法
5369
查看次数

C++如何使用fstream读取带有空格的制表符分隔文件

我需要使用一些 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)

c++ fstream

6
推荐指数
1
解决办法
2万
查看次数

有没有办法以原子方式从文件C++中读取一行

我目前正在开发一个项目,我有一个大文本文件(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个步骤读取值,因为我会经常得到:

Item1
Item2
Item3
Item2
Run Code Online (Sandbox Code Playgroud)

背部.

所以我想知道是否有办法原子地读取文件的一行?首先将它加载到数组中是行不通的,因为文件太大了,我不希望一次加载文件.

我遗憾地找不到关于fstream和getline原子性的任何内容.如果有一个原子版的readline甚至是一个简单的方法来使用锁来实现我想要的东西,我全都耳朵.

提前致谢!

c++ parallel-processing multithreading fstream atomic

6
推荐指数
1
解决办法
567
查看次数

为什么visual studio会提供另一个结果而不是g ++?这里涉及未定义的行为吗?

此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)

c++ gcc fstream visual-studio

6
推荐指数
0
解决办法
146
查看次数

如果文件无法打开,我应该关闭吗?

如果文件无法打开,我应该关闭吗?

我应该写这个:

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)

c++ fstream ifstream

6
推荐指数
1
解决办法
203
查看次数