我在项目目录中有一个.txt文件,我用数据填充.
目录结构如下:
/Users/asd/ClionProjects/ProjectWithTemplates/
main.cpp
cmake
twoday.txt
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
#include <iostream>
#include <array>
#include <cmath>
#include <fstream>
using namespace std;
/* print array prototype */
template <size_t N>
void printArray(const array<double , N> & arr);
/* mean function prototype */
template <size_t N>
double meanArray(const array<double , N> & arr);
/* standard deviation prototype */
template <size_t N>
double sDeviation(const array<double , N> & arr);
int main() {
string date1;
string date2;
array<double, 24> day1Temps;
array<double, 24> day2Temps;
array<double, 3> testarr = …Run Code Online (Sandbox Code Playgroud) 可能重复:
从std :: fstream获取文件*
我正在研究Linux,文件描述符是这个操作系统的主要模型.
我想知道是否有任何库或任何方法从C++开始检索本机Linux文件描述符std::fstream.
我想过,boost::iostream因为有一个叫做的课,file_descriptor但我明白它的目的与我想要达到的目的不同.
你知道某种方法吗?
我正在阅读关于I/O的cplusplus.com教程.最后,它说fstream缓冲区与光盘上的文件同步
明确地,使用操纵器:当在流上使用某些操纵器时,会发生显式同步.这些操纵器是:flush和endl.
和
显式地,使用成员函数sync():调用流的成员函数sync(),它不带参数,导致立即同步.如果流没有关联的缓冲区或者出现故障,则此函数返回一个等于-1的int值.否则(如果流缓冲区已成功同步),则返回0.
除了一些其他隐式案例(例如destroy和stream.close())
在我的代码中,我总是使用flush().
有关std :: flush()的文档:
刷新流缓冲区
将与流关联的缓冲区同步到其受控输出序列.这实际上意味着缓冲区中的所有未写入字符都会尽快写入其受控输出序列("刷新").
有关std :: streambuf :: sync()的文档:
将输入缓冲区与字符源同步
调用它来使流缓冲区与受控序列同步(就像文件流中的文件一样).公共成员函数pubsync调用此受保护的成员函数来执行此操作.
如果这是一个新手问题,请原谅我; 我是个菜鸟.
void read_foo (std::ifstream& out);
void write_foo (std::ofstream& out);
Run Code Online (Sandbox Code Playgroud)
我有这两个函数,其中一个应该从一个文件读取,另一个应该写入一个.
一切都有下面的片段;
std::ifstream ifs ("filename.txt");
read_foo (ifs);
Run Code Online (Sandbox Code Playgroud)
std::ofstream ofs ("filename.txt");
write_foo (ofs);
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用a std::fstream,那么我可以使用相同的流调用这两个函数,它不会编译,并且编译器会发出大量错误消息.
fstream到ifstream&,或ofstream&?#include <fstream>
void read_foo (std::ifstream& out);
void write_foo (std::ofstream& out);
int main () {
std::fstream fs ("filename.txt");
read_foo (fs);
write_foo (fs);
}
Run Code Online (Sandbox Code Playgroud)
foo.cpp: In function ‘int main()’:
foo.cpp:9:16: error: invalid initialization of reference of type ‘std::ifstream& {aka std::basic_ifstream<char>&}’ from expression of type ‘std::fstream {aka std::basic_fstream<char>}’ read_foo …
我有一个非常简单的问题,这对我来说很难,因为这是我第一次尝试使用二进制文件,我不太了解它们.我想要做的就是将一个整数写入二进制文件.
我是这样做的:
#include <fstream>
using namespace std;
int main () {
int num=162;
ofstream file ("file.bin", ios::binary);
file.write ((char *)&num, sizeof(num));
file.close ();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我做错了什么,你能告诉我什么?
给我带来麻烦的部分是与file.write一致,我不明白.
先感谢您.
我有一个已包含一些数据的文件(例如,8 kB).我想从文件的开头读取一些内容,然后从我读完的地方开始覆盖数据.所以我尝试使用以下代码:
std::fstream stream("filename", std::ios::in | std::ios::out | std::ios::binary);
char byte;
stream.read(&byte, 1);
// stream.seekp(1);
int bytesCount = 4096;
auto bytesVec = std::vector<char>(bytesCount, 'c');
char* bytes = bytesVec.data();
std::cout << stream.bad() << std::endl;
stream.write(bytes, bytesCount);
std::cout << stream.bad() << std::endl;
Run Code Online (Sandbox Code Playgroud)
如果我执行此代码,第一个bad()返回false,但第二个返回true,实际上没有写入任何内容.
如果我减少bytesCount到小于4096的任何值(可能是一些内部缓冲区的大小),第二个bad()返回false,但仍然没有写入.
如果我取消注释该seekp()行,则写入开始工作:bad()返回false并实际写入字节.
为什么seekp()这里有必要?没有它,为什么它不起作用?这是seekp()正确的方法吗?
我在Windows 7上使用Visual Studio 2012.
我的二进制文件看起来像这样.
00000000: 0000 0803 0000 ea60 0000 001c 0000 001c
00000010: 0000 0000 0000 0000 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)
左栏是地址.
我只是尝试阅读0000 0803(= 2051)如下
ifstream if;
if.open("file");
uint32_t a;
if >> a;
Run Code Online (Sandbox Code Playgroud)
正如预期的那样......它不起作用:-(
a执行后只是0.
我试过long, int, unsigned int, unsigned long.都失败了.
为什么这些不起作用,我怎样才能实现目标?
使用下面的程序我尝试测试我可以用多快的速度写入磁盘std::ofstream.
在写入1 GiB文件时,我达到大约300 MiB/s.
但是,使用该cp命令的简单文件复制速度至少快两倍.
我的程序是否达到了硬件限制,还是可以更快?
#include <chrono>
#include <iostream>
#include <fstream>
char payload[1000 * 1000]; // 1 MB
void test(int MB)
{
// Configure buffer
char buffer[32 * 1000];
std::ofstream of("test.file");
of.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
auto start_time = std::chrono::steady_clock::now();
// Write a total of 1 GB
for (auto i = 0; i != MB; ++i)
{
of.write(payload, sizeof(payload));
}
double elapsed_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now() - start_time).count();
double megabytes_per_ns = 1e3 / elapsed_ns;
double megabytes_per_s = 1e9 * megabytes_per_ns; …Run Code Online (Sandbox Code Playgroud) 我一直想知道一段时间,文件流是如何工作的?使用文件流,我的意思是访问文件的一部分而不将整个文件加载到内存中.
我(相信)知道C++类(i|o)fstream正是这样做的,但它是如何实现的?是否可以自己实现文件流?
它是如何在最低的C/C++(或任何支持文件流的语言)级别下工作的?难道C函数fopen,fclose,fread和FILE*指针已经采取流(即不加载整个文件到内存)的照顾?如果没有,您将如何直接从硬盘驱动器读取并且是否已在C/C++中实现了这样的设施?
任何正确方向的链接,提示,指针都会非常有用.我用谷歌搜索了,但似乎谷歌并不太明白我追求的是什么......
Ninja-Edit:如果有人知道如何在汇编/机器代码级别工作,如果可以自己实现,或者你必须依赖系统调用,那就太棒了.:)不是答案的要求,虽然正确方向的链接会很好.
什么是适当的I/O标志集std::fstream,我希望能够读取和写入文件,而不截断文件(如果存在),但如果不存在则创建它?
我试过了
std::ios::binary | std::ios::in | std::ios::out
std::ios::binary | std::ios::in | std::ios::out | std::ios::ate
Run Code Online (Sandbox Code Playgroud)
但如果文件尚不存在,则这些文件都不会创建.
我不想要std::ios::app,因为我还需要能够随意搜索文件,包括get和put游标.
我认为,一种解决方法是实例化std::ofstream第一个,然后立即关闭它并打开我真正想要的流,但如果可以通过单个流对象避免它,那似乎很麻烦.