我正在使用C++对几个大文件进行排序.我有一个文本文件,其中包含所有输入文件的名称,每行一个.我想一次读取一个文件名,将它们存储在一个数组中,然后用这些名称创建一个文件.现在,我正在使用fopen和fread,它需要字符数组(我试图优化速度),所以我的文件名被读入一个字符数组数组.但是,这些数组需要预先确定最大大小,因此如果文件名小于最大值,则其余数据充满了垃圾.然后,当我尝试在fopen()中使用该数组作为文件名时,它无法识别该文件,因为它在字符串的末尾有垃圾.我怎么解决这个问题?这是我的代码:
#include <iostream>
#include <fstream>
#include <string>
#include "stdafx.h"
#define NUM_INPUT_FILES 4
using namespace std;
FILE *fp;
unsigned char *buff;
FILE *inputFiles[NUM_INPUT_FILES];
int _tmain(int argc, _TCHAR* argv[])
{
buff = (unsigned char *) malloc(2048);
char j[8];
char outputstring[] = "Feelings are not supposed to be logical. Dangerous is the man who has rationalized his emotions. (David Borenstein)";
fp = fopen("hello.txt", "r");
string tempfname[NUM_INPUT_FILES];
//fp = fopen("hello.txt", "r");
for(int i=0;i<NUM_INPUT_FILES;i++)
{
fgets(tempfname[i], 20, fp);
cout << tempfname[i];
}
fclose(fp);
for(int i=0; …Run Code Online (Sandbox Code Playgroud) 我有一个668x493的数组,我想保存.所以我正在做以下事情.
data:是一个指向保存值的数组的指针.
long lSize;
FILE* image_save;
image_save=fopen("image_save_file.bin","w+b");
fwrite(data,1,329324,image_save);
Run Code Online (Sandbox Code Playgroud)
但是,当我读回这个数组时:
char* check_image;
p1File=fopen("image_save_file.bin","r+b");
fseek (p1File , 0 , SEEK_END);
lSize = ftell (p1File);
fseek (p1File , 0 , SEEK_SET);
Run Code Online (Sandbox Code Playgroud)
当我检查lSize时,我看到它327680 ???
所以,当我做恐惧时,我只获得327680值!
请问,你能指出我的错误吗?
如果我明确声明缓冲区大小,我似乎只能将文件读入内存.这有效
#include <stdio.h>
int main(){
FILE *fp = fopen("test.log", "rb");
char buffer[37];
fread(buffer, 1, 36, fp);
printf("%s", buffer);
}
Run Code Online (Sandbox Code Playgroud)
这会将垃圾添加到输出中
#include <stdio.h>
int main(){
FILE *fp = fopen("test.log", "rb");
fseek(fp, 0, SEEK_END);
long siz = ftell(fp);
rewind(fp);
char buffer[siz + 1];
fread(buffer, 1, siz, fp);
printf("%s", buffer);
}
Run Code Online (Sandbox Code Playgroud) 我有一个从二进制文件中读取“块”的类。我这样使用它:
while(log.HasNextBlock()) {
block = log.GetNextBlock();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我在文件末尾,我需要检查函数 HasNextBlock() 的内部,在这种情况下我将返回 false。我正在尝试使用 feof() 来检查,但我读到在调用 feof() 之前我必须执行读取操作,但在我的情况下,读取操作是在 GetNextBlock() 中完成的,即在调用 feof 之后()。
有没有办法查看我是否在二进制文件的末尾而不执行会修改“上下文”的操作(即不更改文件中的当前位置或任何其他变量)?
谢谢你的帮助 !:)
我从以下函数中获取内存泄漏:
int ReadWrite(int socket, char *readfile) {
FILE *rf = NULL;
rf = fopen(readfile, "rb");
fseek(rf, 0, SEEK_END);
int len = ftell(rf);
rewind(rf);
char readbuf[len + 1];
int res = fread(readbuf, len, 1, rf);
readbuf[len + 1] = '\0';
fclose(rf);
while (1) {
int wres = write(socket, readbuf, res);
if (wres == 0) {
cerr << "socket closed prematurely" << endl;
close(socket);
return EXIT_FAILURE;
}
if (res == -1) {
if (errno == EINTR)
continue;
cerr << "socket write failure: …Run Code Online (Sandbox Code Playgroud) #define MAXSIZE 256
fread(buff, sizeof(MAXSIZE), 1, infp);
Run Code Online (Sandbox Code Playgroud)
最多说我们需要阅读3次,阅读2次后剩下的东西infp都要小于MAXSIZE.我们如何确定上次阅读时的信息大小?
我编写了一个程序,将指针写入文件(fwrite)并从文件读取指针(fread)。但是,该程序似乎没有在文件中写入任何内容,也没有从文件中读取任何内容。它只是将指针的最终增量打印5次并退出。谁能在我的语法中发现似乎正在执行此操作的错误/错误?
#include <stdio.h>
int main() {
FILE *fTest;
int *testPtr;
int x = 10;
if ((fTest = fopen("test.c", "wb")) == NULL) {
printf("Error!");
}
testPtr = &x;
int i;
for (i = 0; i < 5; i++) {
fwrite(testPtr, sizeof(int), 1, fTest);
*testPtr += 1;
}
for (i = 0; i < 5; i++) {
fread(testPtr, sizeof(int), 1, fTest);
printf("%d", *testPtr);
}
fclose(fTest);
}Run Code Online (Sandbox Code Playgroud)
我有一个相当简单的脚本,应该在文件中添加新的字符串.
if (isset($_POST["score"]))
{
$myFile = $_SERVER['DOCUMENT_ROOT']."/xx/zz.txt";
$fh = fopen($myFile, 'r');
$theData = fread($fh, filesize($myFile));
fclose($fh);
$File = $_SERVER['DOCUMENT_ROOT']."/xx/zz.txt";
$Handle = fopen($File, 'w');
$Data = $_POST["score"]."\n".$theData;
fwrite($Handle, $Data);
fclose($Handle);
}
Run Code Online (Sandbox Code Playgroud)
升级到PHP 7.0后,我收到错误:
fread() expects parameter 1 to be resource, boolean given in /home/zzz/public_html/zzz.php on line 7
fclose() expects parameter 1 to be resource, boolean given in /home/zzz/public_html/zzz.php on line 8
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么会出现这个错误以及如何修复它?什么是PHP 7.0导致它突然停止工作?
我有一个这样的课:
struct SomeClass{
SomeClass(){}
SomeClass(const SomeClass& rhs):
_m1(rhs._m1),
_m2(rhs._m2),
_m3(rhs._m3),
_m4(rhs._m4){}
SomeClass& operator=(const SomeClass& rhs){
// same as above
return *this;
}
int _m1;
std::vector<int> _m2;
std::vector<int> _m3;
int _m4;
};
Run Code Online (Sandbox Code Playgroud)
在我的程序中的某个时刻,我想保存存储在SomeClass对象中的数据供以后使用:
SomeClass someObj = arr->getBest(); // arr is a pointer to AnotherClass,
// in which different SomeClass
// objects are initialized and then
// involved in various
// computations in AnotherClass,
// finally the best one SomeClass
// object will be save here
fwrite(&someObj, sizeof(SomeClass), 1, saveFile); …Run Code Online (Sandbox Code Playgroud) 我正在尝试读取UTF文件,并决定以二进制模式读取它,并跳过非ASCII,因为文件基本上由有效的英文文本组成。我坚持fread返回1而不是请求的字节数。恕我直言,print_hex的第一个输出显示它已读取多个字符。我已经阅读了一些在C中读取二进制文件的示例,例如,在C中读取/写入到二进制文件,在fread此处阅读有关示例,例如https://en.cppreference.com/w/c/io/fread以及此处fread的真正工作原理?,仍然困惑为什么会返回1. File hexdump,以及完整的C代码和下面的输出。
添加:由gcc编译,在Linux上运行。
文件:
00000000 ff fe 41 00 41 00 42 00 61 00 0d 00 0a 00 41 00 |..A.A.B.a.....A.|
00000010 41 00 45 00 72 00 0d 00 0a 00 66 00 73 00 61 00 |A.E.r.....f.s.a.|
00000020 6a 00 0d 00 0a 00 64 00 73 00 61 00 66 00 64 00 |j.....d.s.a.f.d.|
00000030 73 00 61 00 66 00 64 00 73 00 61 …Run Code Online (Sandbox Code Playgroud)