我正在使用cstdio (stdio.h)从二进制文件读取和写入数据.由于遗留代码,我必须使用此库,它必须与Windows和Linux跨平台兼容.我有一个FILE* basefile_,我用的变量来读取configLabelLength和configLabel,在那里configLabelLength告诉我多少内存来分配的configLabel.
unsigned int configLabelLength; // 4 bytes
char* configLabel = 0; // Variable length
fread((char *) &configLabelLength, 1, sizeof configLabelLength, baseFile_);
configLabel = new char[configLabelLength];
fread(configLabel,1, configLabelLength,baseFile_);
delete [] configLabel; // Free memory allocated for char array
configLabel = 0; // Be sure the deallocated memory isn't used
Run Code Online (Sandbox Code Playgroud)
有没有办法在configLabel不使用指针的情况下读入?例如,有一个解决方案,我可以使用c ++矢量库或我不必担心指针内存管理的东西.
我正在尝试从PNG文件中读取标头.
结果应该是
Dec: 137 80 78 71 13 10 26 10
Hex: 89 50 4E 47 0D 0A 1A 0A
Run Code Online (Sandbox Code Playgroud)
但是,我明白了
Dec: 4294967 80 78 71 13 10 26 10
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
码:
char T;
pngFile = fopen(Filename, "rb");
if(pngFile)
{
fread(&T, 1, 1, pngFile);
fclose(pngFile);
printf("T: %u\n", T);
}
Run Code Online (Sandbox Code Playgroud) 嗨,我有一个非常令人沮丧的指针问题,有人可以让我知道我在这里做错了什么。谢谢
// This functions reads from the file
void get__data_block_from_disk(char* ptr, int block_num){
int file_desc;
int x;
open_fs(file_path);
file_desc = fileno(fileptr);
x = lseek(file_desc, DATA_BLOCK_OFFSET + block_num*BLOCK_SIZE, SEEK_SET);
fread(&ptr, BLOCK_SIZE, 1, fileptr);
close_fs();
}
// This function writes to the file
void place__data_block_into_disk(char* ptr, int block_num){
int file_desc;
int x;
printf("char in place: %c\n", ptr);
open_fs(file_path);
file_desc = fileno(fileptr);
x = lseek(file_desc, DATA_BLOCK_OFFSET + block_num*BLOCK_SIZE, SEEK_SET);
fwrite(ptr, BLOCK_SIZE, 1, fileptr);
close_fs();
}
Run Code Online (Sandbox Code Playgroud) 我有以下结构:
typedef struct {
char last[NAMESIZE];
char first[NAMESIZE];
} name;
typedef struct {
int id;
name name;
float score;
} record;
typedef struct {
record *data;
size_t nalloc;
size_t nused;
} record_list;
Run Code Online (Sandbox Code Playgroud)
我试图使用此函数从文件中读取记录:
int file_read(record_list *list, record* rec)
{
/* irrelevant code eliminated */
while(fread(&records, sizeof(record), 1, fp))
{
*rec = records;
valid_list_insert = list_insert(list, rec);
if(!valid_list_insert)
{
return 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用此函数将record_list写入文件:
int file_write(record_list* list)
{
/* irrelevant code eliminated */
if(fwrite(&list, sizeof(record_list), 1, fp) == 0)
{ …Run Code Online (Sandbox Code Playgroud) 我想知道我是否可以使用fread将数据读入整数缓冲区.我看到fread()将void*作为第一个参数.所以我不能只传递一个整数缓冲区(类型转换为void*)然后使用它来读取我想要的文件中的howmuchevery字节,只要缓冲区足够大?
即.我无法做到:
int buffer[10];
fread((void *)buffer, sizeof(int), 10, somefile);
// print contents of buffer
for(int i = 0; i < 10; i++)
cout << buffer[i] << endl;
Run Code Online (Sandbox Code Playgroud)
这有什么不对?
谢谢
我是从这样的文件中读取的:
#include <stdio.h>
int main() {
FILE *fp = fopen("sorted_hits", "r+");
while(!feof(fp)) {
int item_read;
int *buffer = (int *)malloc(sizeof(int));
item_read = fread(buffer, sizeof(int), 1, fp);
if(item_read == 0) {
printf("at file %ld\n", ftell(fp));
perror("read error:");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个文件很大,我有时会收到"错误的文件描述符"错误."ftell"表示发生错误时文件位置停止.
我不知道为什么它"有时",这是正常的吗?问题出在我的代码或硬盘中吗?怎么办呢?
我试图不断从不同的文件中读取数据到unsigned char*类型的缓冲区.但是,在读取下一个文件之前,我似乎无法将缓冲区设置为NULL.
这里只是相关的代码:
#include <stdio.h>
#include <fstream>
int
main (int argc, char** argv) {
FILE* dataFile = fopen("C:\\File1.txt", "rb");
unsigned char *buffer = NULL;
buffer = (unsigned char*)malloc(1000);
fread(buffer,1,1000,dataFile);
fclose(dataFile);
dataFile = fopen("C:\\File2.txt", "rb");
buffer = NULL;
fread(buffer,1,1000,dataFile);
fclose(dataFile);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我遇到的错误是在第二次出现这行:fread(buffer,1,1000,dataFile);
我得到的错误是:
调试断言失败!表达式:(缓冲区!= NULL)
它指向fread.c的第147行,基本上是:
Run Code Online (Sandbox Code Playgroud)/* validation */ _VALIDATE_RETURN((buffer != NULL), EINVAL, 0); if (stream == NULL || num > (SIZE_MAX / elementSize)) { if (bufferSize != SIZE_MAX) { memset(buffer, _BUFFER_FILL_PATTERN, bufferSize); } _VALIDATE_RETURN((stream != NULL), …
我的代码将文件读入 unsigned char* 数组。该文件实际上是一个文本文件,其“正常”行结尾为 0x0D、0x0A,长度为 64 字节。
FILE * inputFile = fopen(sInfile.c_str(), "r+");
unsigned char * readArray = (unsigned char *)malloc(sizeof(unsigned char)*readSize); //readSize=64
int bytes_read = fread(readArray, sizeof(unsigned char), readSize, inputFile);
Run Code Online (Sandbox Code Playgroud)
但 bytes_read 是 59,当我检查 readArray 时,它没有任何 \r (0x0D),但文件有。为什么 fread 会跳过所有这些值?有没有一个设置可以控制这个?
struct st {
char *p;
int len;
};
Run Code Online (Sandbox Code Playgroud)
这是我需要写入二进制文件的结构,以及保存在中的字符串
char *p
我应该用字符数组数据编写一个二进制文件。写入二进制文件后。还应该能够从二进制文件中以相同的结构读取它。
我尝试使用 FSEEK_END 获取二进制大小,并根据文件大小执行 fread,但它没有保存字符串。请建议。任何帮助/建议/指示将不胜感激。
提前致谢。
示例代码:
struct st {
char *p;
int len;
};
struct st varr;
varr.len = 100;
varr.p = new char[gen];
strcpy(varr.p, "Hello World");
FILE *p;
p=fopen("address","wb");
fwrite(&varr,sizeof(struct st),1,p);
fclose(p);
Run Code Online (Sandbox Code Playgroud)
这将向我写入指向二进制文件的指针。但我想在这里写整个字符串,但重点是,它应该用一个 fwrite 完成。
我正在用 C 训练文件处理,我试图在fseek()写入和读取时更改文件的单行或位置,fread()无论fwrite()是否更改变量并再次写入整个文件,但显然附加模式和写入模式都不允许您正如我在下面的示例中尝试的那样执行此操作:
void main()
{
FILE *file;
char answer;
char text[7] = "text 1\n";
char text2[7] = "text 2\n";
file = fopen("fseek.txt", "w"); //creating 'source' file
fwrite(text, sizeof(char), sizeof(text), file);
fwrite(text, sizeof(char), sizeof(text), file);
fwrite(text, sizeof(char), sizeof(text), file);
fclose(file);
scanf("%c", &answer);
switch(answer)
{
case 'a':
//attempt to change single line with append mode
file = fopen("fseek.txt", "a");
fseek(file, 7, SEEK_SET); //7 characters offset is the second line of the file
fwrite(text2, sizeof(char), sizeof(text), …Run Code Online (Sandbox Code Playgroud)