我正在读取二进制文件:
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) 有关于使用千位/百万分隔符打印整数的问题.
我有一个文本文件,我得到了国家,城市,总人口.
我必须在文件中阅读,并按国家排序.如果国家是一个国家,我必须按人口减少排序.
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
有没有办法通过再次添加分隔符来操纵打印?
提前谢谢了
如果在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"的先前内容中,还是会替换先前的内容?
在我打开的文件中获取当前行的行号的最佳方法是ifstream什么?所以我正在读取数据,我需要存储它所在的行号,这样如果数据与规格不符,我可以稍后显示它.
我正在编写一个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++中读取?
它一直是一个令人不快的意外'\n' 被替换与"\r\n"在Windows上,我不知道.(我猜它也在Mac上被替换了......)
有没有一种简单的方法可以确保Linux,Mac和Windows用户可以轻松地交换文本文件?
简单来说,我的意思是:无需以二进制模式编写文件或自行测试和替换行尾字符(或使用某些第三方程序/代码).此问题会影响我的C++程序执行文本文件I/O.
任何给定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) 我试图从正在增长的文件(类似于什么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我试图存储文件的当前结束位置,这样当我重新打开它时,我可以去那里并阅读已添加的内容.
我想知道我的代码有什么问题,如果真的有必要为此目的关闭并重新打开同一个文件.
谢谢.
我知道可以截断一个文件
std::fstream fs(mypath, std::fstream::out | std::fstream::trunc);
Run Code Online (Sandbox Code Playgroud)
但我需要读取文件,截断它,然后用相同的文件句柄写所有内容(所以整个操作是原子的).任何人?