标签: fstream

如何使用std :: ifstream读取具有宽字符串路径的二进制文件

我正在读取二进制文件:

const size_t stBuffer = 256;
char buffer[stBuffer];
std::wstring wPath(L"blah");
std::wifstream ifs(wPath.c_str(), std::wifstream::in | std::wifstream::binary)
while (ifs.good())
{
  ifs.read(buffer, sizeof(buffer));
  ...
}
Run Code Online (Sandbox Code Playgroud)

但我意识到这不是一个真正的二进制读取.ifstream实际上读取一个字节并将其转换为宽字符.所以,如果二进制文件有内容0x112233...ff,我实际上读了0x110022003300...ff00.

这对我来说没有多大意义:首先,我只需要使用一个宽的fstream,因为文件名是非拉丁语.其次,如果我说fstream是二进制的,为什么read读取宽字符?下面的代码做我想要的.有没有办法用std fstream实现这个目标?

FILE* ifs = _wfopen(L"blah", L"rb");
while (!feof(ifs))
{
  size_t numBytesRead = fread(buffer, 1, sizeof(buffer), ifs);
  ...
}
Run Code Online (Sandbox Code Playgroud)

c++ fstream

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

打印数千和百万分隔符的整数

有关于使用千位/百万分隔符打印整数的问题.

我有一个文本文件,我得到了国家,城市,总人口.

我必须在文件中阅读,并按国家排序.如果国家是一个国家,我必须按人口减少排序.

Textfile就像:

澳大利亚悉尼........ ......... 10.123.456

巴西...........圣保罗....... 7.123.345

我将所有3个读成一个单独的字符串.然后我擦除所有"." 在人口字符串中.然后我使用atoi()将填充字符串转换为整数.

现在,如果国家平等,我可以按人口排序.这种方式正常.

到现在为止还挺好.但我需要千万/百万的分离器进入印刷人口.

如果我使用字符串,用"." 对于人口,排序不正常.它的排序如下:

X ........ X ...... 1.123456

X ........ X ...... 10.123.456

X ........ X ...... 2.123.232

它必须看起来像:

澳大利亚悉尼........ ......... 10.123.456

澳大利亚布里斯班........ ....... 8.123.456

有没有办法通过再次添加分隔符来操纵打印?

提前谢谢了

c++ fstream separator

12
推荐指数
2
解决办法
6922
查看次数

std :: ofstream是否会截断或追加默认值?

如果在std::ofstream没有openmode标志的情况下ios_base::out调用构造函数,则默认标志为.但这是暗示ios_base::trunc还是ios_base::app

换句话说,如果您的文件系统中已经有一个非空文件"past.txt"并且您正在调用

std::ofstream stream( "past.txt" );
stream << "new content";
Run Code Online (Sandbox Code Playgroud)

"新内容"是否会附加到"past.txt"的先前内容中,还是会替换先前的内容?

c++ fstream

12
推荐指数
1
解决办法
4175
查看次数

如何从C++文件中获取行号?

在我打开的文件中获取当前行的行号的最佳方法是ifstream什么?所以我正在读取数据,我需要存储它所在的行号,这样如果数据与规格不符,我可以稍后显示它.

c++ fstream line

11
推荐指数
3
解决办法
2万
查看次数

读取popen会产生C++

我正在编写一个C++应用程序,我需要读取系统命令的结果.

我正在使用popen()更多或更少,如下所示:

    const int MAX_BUFFER = 2048;
    string cmd="ls -l";
    char buffer[MAX_BUFFER];
    FILE *stream = popen(cmd.c_str(), "r");
    if (stream){
       while (!feof(stream))
       {
            if (fgets(buffer, MAX_BUFFER, stream) != NULL)
            {
               //here is all my code
            }
       }
       pclose(stream);
    }
Run Code Online (Sandbox Code Playgroud)

我一直试图以不同的方式重写这个.我看到一些非标准的解决方案,如:

FILE *myfile;
std::fstream fileStream(myfile);
std::string mystring;
while(std::getline(myfile,mystring))
{
    // .... Here I do what I need
}
Run Code Online (Sandbox Code Playgroud)

我的编译器不接受这个.

如何从popenC++中读取?

c++ fstream file stream popen

11
推荐指数
1
解决办法
4万
查看次数

便携式终端(换行)

它一直是一个令人不快的意外'\n' 被替换"\r\n"在Windows上,我不知道.(我猜它也在Mac上被替换了......)

有没有一种简单的方法可以确保Linux,Mac和Windows用户可以轻松地交换文本文件?

简单来说,我的意思是:无需以二进制模式编写文件或自行测试和替换行尾字符(或使用某些第三方程序/代码).此问题会影响我的C++程序执行文本文件I/O.

c++ portability fstream cross-platform newline

11
推荐指数
3
解决办法
8804
查看次数

如何在C++中手动读取PNG文件?

便携式网络图形概述

任何给定PNG文件的总体布局如下所示:

文件头:8字节签名.

Chunks:数据块,从图像属性到实际图像本身.


问题

我想用C++读取PNG文件而不使用任何外部库.我想这样做是为了更深入地理解PNG格式和C++编程语言.

我开始使用fstream逐字节读取图像,但我无法通过任何PNG文件的标头.我尝试使用read( char*, int )将字节放入char数组,但read在标头之后的每个字节都失败.

如上所示,我认为我的程序总是被文件结束1A字节所占用.我正在使用Windows 7开发Windows 7和Linux机器.


一些我的(旧)代码

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstddef>

const char* INPUT_FILENAME = "image.png";

int main()
{
  std::ifstream file;
  size_t size = 0;

  std::cout << "Attempting to open " << INPUT_FILENAME << std::endl;

  file.open( INPUT_FILENAME, std::ios::in | std::ios::binary | std::ios::ate );
  char* data = 0;

  file.seekg( 0, std::ios::end );
  size = file.tellg();
  std::cout << "File …
Run Code Online (Sandbox Code Playgroud)

c++ file-io png fstream ifstream

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

如何在C++中阅读不断增长的文本文件?

我试图从正在增长的文件(类似于什么tail -F)中读取,但我的代码必定存在一些问题:

string   log, logFile("test.log");
size_t   p = 0;

while(true)
{
    ifstream ifs(logFile.c_str());

    ifs.seekg(p);  //*1

    while(ifs.eof() == false)
    {
        getline(ifs, log);

        cout << log << endl;

        p = ifs.tellg();  //*2
    }

    nanosleep(&pause, NULL);
}
Run Code Online (Sandbox Code Playgroud)

如果没有//*1和//*2的行,日志文件会被正确读取到最后,但是如果添加新行,则不会发生任何事情.

使用seekg和tellg我试图存储文件的当前结束位置,这样当我重新打开它时,我可以去那里并阅读已添加的内容.

我想知道我的代码有什么问题,如果真的有必要为此目的关闭并重新打开同一个文件.

谢谢.

c++ logging fstream stl seekg

10
推荐指数
2
解决办法
7083
查看次数

如何在使用fstream打开文件时截断文件

我知道可以截断一个文件

std::fstream fs(mypath, std::fstream::out | std::fstream::trunc);
Run Code Online (Sandbox Code Playgroud)

但我需要读取文件,截断它,然后用相同的文件句柄写所有内容(所以整个操作是原子的).任何人?

c++ fstream std

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

为什么fstream不是从c ++中的ifstream和ofstream继承而来的?

ifstream并且ofstream是用于文件中的输入和输出,并且fstream可以执行它们的任务但不能继承任何一个,ifstream并且ofstream,这个代码是重复还是别的?

fstream的层次结构

c++ fstream iostream ofstream

10
推荐指数
1
解决办法
384
查看次数