Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在特定条件下调整文件大小。c++;调整文件大小不在循环中工作 我不知道VisualStudio中文件系统ResiZEX文件标准C++ 17的问题。当我用手动测试STL时。它可以按预期调整大小。在条件中使用时。它就像一只虫子。结果输出分为两部分。我用2MB大小的文件测试它。我期望的结果是,输入文件最终应调整为0字节 std::ifstream input("D:/input.exe", std::ios::binary); if (input.is_open()) { std::ofstream output("D:/output.exe", std::ios::binary | std::ios::ate | std::ios::app); auto p = std::filesystem::path("D:/input.exe"); std::vector<char> buffer(1048576); do { long long setPosition; if (std::filesystem::file_size(p) > buffer.size()) { setPosition = (std::filesystem::file_size(p) - buffer.size()); input.seekg(setPosition); } else { input.seekg(0); } input.read(buffer.data(), buffer.size()); std::streamsize dataSize = input.gcount(); if (dataSize) { output.seekp(0); output.write(buffer.data(), dataSize); long long resizeFile = (std::filesystem::file_size(p) - dataSize); std::filesystem::resize_file(p, resizeFile); } else { output.close(); input.close(); break; } } while (true); } else { std::cout << "File is not exist"; } std::ifstream输入(“D:/input.exe”,std::ios::binary); if(input.is_open()) { 流输出的std::of(“D:/output.exe”,std::ios::binary | std::ios::ate | std::ios::app); auto p=std::filesystem::path(“D:/input.exe”); 标准::向量缓冲区(1048576); 做 { 长置位; if(std::filesystem::file_size(p)>buffer.size()) { setPosition=(std::filesystem::file_size(p)-buffer.size(); 输入。参见千克(设置位置); } 其他的 { 输入。参见千克(0); } input.read(buffer.data(),buffer.size()); std::streamsize dataSize=input.gcount(); 如果(数据大小) { 输出。seekp(0); output.write(buffer.data(),dataSize); long-long-resizeFile=(标准::文件系统::文件大小(p)-dataSize); std::filesystem::resize_文件(p,resizeFile); } 其他的 { output.close(); input.close(); 打破 } }虽然(正确); } 其他的 { std::cout_C++_Windows_Visual Studio - Fatal编程技术网 buffer.size()) { setPosition=(std::filesystem::file_size(p)-buffer.size(); 输入。参见千克(设置位置); } 其他的 { 输入。参见千克(0); } input.read(buffer.data(),buffer.size()); std::streamsize dataSize=input.gcount(); 如果(数据大小) { 输出。seekp(0); output.write(buffer.data(),dataSize); long-long-resizeFile=(标准::文件系统::文件大小(p)-dataSize); std::filesystem::resize_文件(p,resizeFile); } 其他的 { output.close(); input.close(); 打破 } }虽然(正确); } 其他的 { std::cout,c++,windows,visual-studio,C++,Windows,Visual Studio" /> buffer.size()) { setPosition=(std::filesystem::file_size(p)-buffer.size(); 输入。参见千克(设置位置); } 其他的 { 输入。参见千克(0); } input.read(buffer.data(),buffer.size()); std::streamsize dataSize=input.gcount(); 如果(数据大小) { 输出。seekp(0); output.write(buffer.data(),dataSize); long-long-resizeFile=(标准::文件系统::文件大小(p)-dataSize); std::filesystem::resize_文件(p,resizeFile); } 其他的 { output.close(); input.close(); 打破 } }虽然(正确); } 其他的 { std::cout,c++,windows,visual-studio,C++,Windows,Visual Studio" />

在特定条件下调整文件大小。c++;调整文件大小不在循环中工作 我不知道VisualStudio中文件系统ResiZEX文件标准C++ 17的问题。当我用手动测试STL时。它可以按预期调整大小。在条件中使用时。它就像一只虫子。结果输出分为两部分。我用2MB大小的文件测试它。我期望的结果是,输入文件最终应调整为0字节 std::ifstream input("D:/input.exe", std::ios::binary); if (input.is_open()) { std::ofstream output("D:/output.exe", std::ios::binary | std::ios::ate | std::ios::app); auto p = std::filesystem::path("D:/input.exe"); std::vector<char> buffer(1048576); do { long long setPosition; if (std::filesystem::file_size(p) > buffer.size()) { setPosition = (std::filesystem::file_size(p) - buffer.size()); input.seekg(setPosition); } else { input.seekg(0); } input.read(buffer.data(), buffer.size()); std::streamsize dataSize = input.gcount(); if (dataSize) { output.seekp(0); output.write(buffer.data(), dataSize); long long resizeFile = (std::filesystem::file_size(p) - dataSize); std::filesystem::resize_file(p, resizeFile); } else { output.close(); input.close(); break; } } while (true); } else { std::cout << "File is not exist"; } std::ifstream输入(“D:/input.exe”,std::ios::binary); if(input.is_open()) { 流输出的std::of(“D:/output.exe”,std::ios::binary | std::ios::ate | std::ios::app); auto p=std::filesystem::path(“D:/input.exe”); 标准::向量缓冲区(1048576); 做 { 长置位; if(std::filesystem::file_size(p)>buffer.size()) { setPosition=(std::filesystem::file_size(p)-buffer.size(); 输入。参见千克(设置位置); } 其他的 { 输入。参见千克(0); } input.read(buffer.data(),buffer.size()); std::streamsize dataSize=input.gcount(); 如果(数据大小) { 输出。seekp(0); output.write(buffer.data(),dataSize); long-long-resizeFile=(标准::文件系统::文件大小(p)-dataSize); std::filesystem::resize_文件(p,resizeFile); } 其他的 { output.close(); input.close(); 打破 } }虽然(正确); } 其他的 { std::cout

在特定条件下调整文件大小。c++;调整文件大小不在循环中工作 我不知道VisualStudio中文件系统ResiZEX文件标准C++ 17的问题。当我用手动测试STL时。它可以按预期调整大小。在条件中使用时。它就像一只虫子。结果输出分为两部分。我用2MB大小的文件测试它。我期望的结果是,输入文件最终应调整为0字节 std::ifstream input("D:/input.exe", std::ios::binary); if (input.is_open()) { std::ofstream output("D:/output.exe", std::ios::binary | std::ios::ate | std::ios::app); auto p = std::filesystem::path("D:/input.exe"); std::vector<char> buffer(1048576); do { long long setPosition; if (std::filesystem::file_size(p) > buffer.size()) { setPosition = (std::filesystem::file_size(p) - buffer.size()); input.seekg(setPosition); } else { input.seekg(0); } input.read(buffer.data(), buffer.size()); std::streamsize dataSize = input.gcount(); if (dataSize) { output.seekp(0); output.write(buffer.data(), dataSize); long long resizeFile = (std::filesystem::file_size(p) - dataSize); std::filesystem::resize_file(p, resizeFile); } else { output.close(); input.close(); break; } } while (true); } else { std::cout << "File is not exist"; } std::ifstream输入(“D:/input.exe”,std::ios::binary); if(input.is_open()) { 流输出的std::of(“D:/output.exe”,std::ios::binary | std::ios::ate | std::ios::app); auto p=std::filesystem::path(“D:/input.exe”); 标准::向量缓冲区(1048576); 做 { 长置位; if(std::filesystem::file_size(p)>buffer.size()) { setPosition=(std::filesystem::file_size(p)-buffer.size(); 输入。参见千克(设置位置); } 其他的 { 输入。参见千克(0); } input.read(buffer.data(),buffer.size()); std::streamsize dataSize=input.gcount(); 如果(数据大小) { 输出。seekp(0); output.write(buffer.data(),dataSize); long-long-resizeFile=(标准::文件系统::文件大小(p)-dataSize); std::filesystem::resize_文件(p,resizeFile); } 其他的 { output.close(); input.close(); 打破 } }虽然(正确); } 其他的 { std::cout,c++,windows,visual-studio,C++,Windows,Visual Studio,您尝试执行的操作将不起作用。resize_file将截断文件末尾的文件,因此当您从文件开头读取X字节,然后截断文件时,您将在文件末尾截断X字节。您可能会同时得到input.exe和output.exe包含的内容正在删除原始input.exe的开头。您应该做的是在读取文件后截断该文件。下面的操作将使output.exe成为原始input.exe的副本,input.exe将为0字节 #include <iostream> #include <fstream> #include

您尝试执行的操作将不起作用。
resize_file
将截断文件末尾的文件,因此当您从文件开头读取X字节,然后截断文件时,您将在文件末尾截断X字节。您可能会同时得到
input.exe
output.exe
包含的内容正在删除原始
input.exe
的开头。您应该做的是在读取文件后截断该文件。下面的操作将使
output.exe
成为原始
input.exe
的副本,
input.exe
将为0字节

#include <iostream>
#include <fstream>
#include <filesystem>

int main() {
    auto p = std::filesystem::path("D:/input.exe");
    std::ifstream input(p, std::ios::binary);
    if (input)
    {
        std::ofstream output("D:/output.exe", std::ios::binary);
        std::vector<char> buffer(1048576);
        while (true) {
            input.read(buffer.data(), buffer.size());
            std::streamsize dataSize = input.gcount();
            if (dataSize==0) break;
            output.write(buffer.data(), dataSize);
        }
        std::filesystem::resize_file(p, 0);
    }
    else
    {
        std::cout << "File does not exist";
    }
}
#包括
#包括
#包括
int main(){
auto p=std::filesystem::path(“D:/input.exe”);
std::ifstream输入(p,std::ios::binary);
如果(输入)
{
流输出的std::of(“D:/output.exe”,std::ios::binary);
标准::向量缓冲区(1048576);
while(true){
input.read(buffer.data(),buffer.size());
std::streamsize dataSize=input.gcount();
如果(数据大小==0)中断;
output.write(buffer.data(),dataSize);
}
std::filesystem::resize_文件(p,0);
}
其他的
{

std::cout如果您想截断输入文件,为什么不在读取所有数据后执行一次呢?我还建议您跳过
gcount
检查以查看何时读取所有文件,而是执行例如
while(input.read(…){…}
@Someprogrammerdude这只是一个小文件的例子。如果文件很大,比如说8GB,那么读取全部和截断都会有问题。@Someprogrammerdude我需要api的gcount。我的api输入/输出也没有问题。但问题是调整文件STL的大小。我看不出有问题,因为你是分块读取的。你不会读取al我只是编辑我的问题来添加seekg,如果你说截短将从末尾开始。我从特定的位置和循环中查看seekg。这无关紧要。
resize\u file
将在末尾收缩或扩展文件。你不能实时删除常规文件的开头。你描述的是什么ds就像一个
FIFO
/命名管道。我不知道先进先出是什么意思。如果你知道实时调整文件大小。在处理读取的数据之后。如果不是实时的,它需要两倍的空间来临时处理。命名管道是一个FIFO,它是一个文件系统实体,一个进程可以写入,另一个进程可以读取。Its size是管道中的字节数,因此当您写入或读取它时,它将调整自身大小。当处理常规文件时,是的,在某一点上它将需要双倍大小,即使您从输入文件的末尾开始读取。当您将第一个块写入输出文件时,它也必须位于该文件的末尾文件,这样你就可以直接得到两倍的大小(如果用户希望输出数据的顺序与输入的顺序相同)。我编辑了我的问题,现在输入和预期的一样。但是输出不同。