我正在使用fwrite()并且fread()第一次将一些数据结构写入磁盘,我对最佳实践和正确的处理方式有几个问题.
我正在写入磁盘(所以我以后可以读回来)是在Graph结构中插入的所有用户配置文件.每个图形顶点都是以下类型:
typedef struct sUserProfile {
char name[NAME_SZ];
char address[ADDRESS_SZ];
int socialNumber;
char password[PASSWORD_SZ];
HashTable *mailbox;
short msgCount;
} UserProfile;
Run Code Online (Sandbox Code Playgroud)
这就是我目前正在将所有配置文件写入磁盘的方式:
void ioWriteNetworkState(SocialNetwork *social) {
Vertex *currPtr = social->usersNetwork->vertices;
UserProfile *user;
FILE *fp = fopen("save/profiles.dat", "w");
if(!fp) {
perror("fopen");
exit(EXIT_FAILURE);
}
fwrite(&(social->usersCount), sizeof(int), 1, fp);
while(currPtr) {
user = (UserProfile*)currPtr->value;
fwrite(&(user->socialNumber), sizeof(int), 1, fp);
fwrite(user->name, sizeof(char)*strlen(user->name), 1, fp);
fwrite(user->address, sizeof(char)*strlen(user->address), 1, fp);
fwrite(user->password, sizeof(char)*strlen(user->password), 1, fp);
fwrite(&(user->msgCount), sizeof(short), 1, fp);
break;
currPtr = currPtr->next;
}
fclose(fp); …Run Code Online (Sandbox Code Playgroud) 我的文本文件很少,大小超过30MB.
我如何从PHP中读取这些巨大的文本文件?
我从未在将数据写入文件方面遇到太多麻烦!我正在从MinGW运行GCC,因为我习惯在Linux中使用GCC.我通常使用Linux系统调用open(),write()和read(),但我现在正在编写一个Windows程序,而我在Windows中使用read()/ write()时遇到了麻烦,所以我只是在使用标准库.无论如何,我遇到的问题是我不知道如何写入文件!我已经定义了"FILE*"变量,使用fopen(),"r + b","wb"和"w + b",但我仍然无法用fwrite()或fprintf()写入输出文件.我不知道我甚至做错了什么!这是我的来源:
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#define DEBUG 1
/*** Global functions ***/
double highfreq(double deg);
/*** Global variables ***/
double sin_now;
unsigned int *ptr;
unsigned char *key, *infilename, *outfilename;
FILE *infile, *outfile, *keyfile;
const char *pipe_name="[pipe]";
int main(int argc, char *argv[]) {
unsigned int x, y, z;
if(argc!=3) {
fprintf(stderr, "Syntax error: %s <infile.txt> <outfile.wav>", argv[0]);
return 1;
}
if(argv[1][0]=='-') {
infile=stdin;
infilename=(unsigned char *)pipe_name;
}
else {
infilename=argv[1]; …Run Code Online (Sandbox Code Playgroud) 我对C很陌生,但我遇到了一个问题...
我的最终目标是从.bin文件读取(然后printf到控制台)二进制文件,但是现在我一步一步地尝试只读第一位...
我的代码:
...
FILE *file = fopen("test1.bin", rb);
int i = 0;
fread(&i, 1, 1, file);
printf("%i\n", i);
...
Run Code Online (Sandbox Code Playgroud)
现在我尝试了三个不同的.bin文件,一个输出0,另外两个输出12个!
当我从文件中读取1位时,为什么输出2/12?不应该是0还是1?我究竟做错了什么?非常感谢.
我正在使用fread读取文件的第一个字节:
fread(&example_struct, sizeof(example_struct), 1, fp_input);
Run Code Online (Sandbox Code Playgroud)
哪个在linux和solaris下结果不同?那么example_struct(Elf32_Ehdr)是elf.h中定义的Standart GNU C Liborary的一部分?我很高兴知道为什么会这样?
一般结构看起来如下:
typedef struct
{
unsigned char e_ident[LENGTH];
TYPE_Half e_type;
} example_struct;
Run Code Online (Sandbox Code Playgroud)
调试代码:
for(i=0;paul<sizeof(example_struct);i++){
printf("example_struct->e_ident[%i]:(%x) \n",i,example_struct.e_ident[i]);
}
printf("example_struct->e_type: (%x) \n",example_struct.e_type);
printf("example_struct->e_machine: (%x) \n",example_struct.e_machine);
Run Code Online (Sandbox Code Playgroud)
Solaris输出:
Elf32_Ehead->e_ident[0]: (7f)
Elf32_Ehead->e_ident[1]: (45)
...
Elf32_Ehead->e_ident[16]: (2)
Elf32_Ehead->e_ident[17]: (0)
...
Elf32_Ehead->e_type: (200)
Elf32_Ehead->e_machine: (6900)
Run Code Online (Sandbox Code Playgroud)
Linux输出:
Elf32_Ehead->e_ident[0]: (7f)
Elf32_Ehead->e_ident[1]: (45)
...
Elf32_Ehead->e_ident[16]: (2)
Elf32_Ehead->e_ident[17]: (0)
...
Elf32_Ehead->e_type: (2)
Elf32_Ehead->e_machine: (69)
Run Code Online (Sandbox Code Playgroud)
也许类似于:http://forums.devarticles.com/cc-help-52/file-io-linux-and-solaris-108308.html
我想从文本文件中读取80个字符,将它们保存为字符串,然后打印该字符串进行验证.我正在使用fread并拥有此代码:
char message[80];
size_t nread = fread(message, 1, sizeof(message), fp);
printf("Message received: \"__%s__\"\n", message);
Run Code Online (Sandbox Code Playgroud)
输出是:
收到的消息:"__我很想改变这个世界,但他们不会
__"
当整个短语不在文件中时
和:
__我很乐意改变世界,但他们不会给我源代码
@__
当整个短语在文件中时.
我试过删除它并重写文本,但我再次获得相同的输出.
怎么了?什么与charset?
我使用此代码为我的小HTTP服务器发送二进制文件
/* send binary data to client */
void send_binary(int sock_fd, char *file_name)
{
int buff_size = 10240;
char buff[buff_size];
long file_size;
FILE *pFile;
size_t result;
if ( (pFile = fopen(file_name, "rb")) == NULL){
error("fopen error\n");
}
while( (result = fread(buff, 1, buff_size, pFile)) == buff_size){
send(sock_fd, buff, buff_size, 0);
buff[0] = '\0';
}
if (result > 0){
if(feof(pFile)){
send(sock_fd, buff, result, 0);
}
else{
error("read error\n");
}
}
fclose(pFile);
}
Run Code Online (Sandbox Code Playgroud)
它适用于文本,但不适用于jpeg文件.收到的图像文件已损坏.
我想用HANDLE = CreateFile()交换FILE*以测试速度差异.
我正在尝试更改我的代码.
有人可以告诉我如何更改这两行以反映我现在处理的是句柄而不是文件*了吗?
fseek(myFile,iBytePos,SEEK_SET);
fread(&SomeValues[0],iByteCount,1,myFile);
Run Code Online (Sandbox Code Playgroud)
我试过了
LARGE_INTEGER l;
l.QuadPart=iBytePos;
SetFilePointer(myFile,l.LowPart,&l.HighPart,FILE_BEGIN);
DWORD dw;
BOOL result = ReadFile(myFile,&SomeValues[0],iByteCount,&dw,NULL);
Run Code Online (Sandbox Code Playgroud)
但有些事情是不正确的.我肯定在某个地方出了问题.
非常感谢你的帮助!
我有一个名为library.txt的动态.txt文件,它只有一行数据.正是这一个:
63Book Title1|Book Author 1|Book Editor 1|2014|English|255|99.989998|
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用我创建的void readInteger()函数读取文件上的第一个整数(在本例中为数字"63"):
void readInteger(){
FILE *arq = fopen("library.txt", "r+");
if(arq == NULL){
printf("ERROR WHILE OPENING FILE!!!");
return;
}
int x;
fread(&x, sizeof(int), 1, arq);
printf("%d", x);
return;
}
Run Code Online (Sandbox Code Playgroud)
但该功能始终保持打印疯狂的数字"1866609462".
有谁知道我的代码有什么问题?你能帮帮我吗?
我一直在努力解决这个问题.使用MATLAB读取包含float格式的三列数字的二进制文件时.
我正在使用这一行一次读一个数字.
pt(j) = fread(fid,1,'float','a');
Run Code Online (Sandbox Code Playgroud)
我发现有时(很少)MATLAB而不是为浮点读取四个字节,它使用5个字节.它错过了其余的阅读.我不确定文件是否已损坏或MATLAB存在错误.当我将文件打印为txt并在txt中读取时,一切正常.
我在这里做的工作就是:
cur = ftell(fid);
if (cur - prev)~= 4
pt(j) = 0; % I m throwing this reading away for the sake of saving the rest of the data. This is not ideal
cur = prev +4;
fseek(fid, cur,'bof');
end
prev = cur;
Run Code Online (Sandbox Code Playgroud)
我尝试了不同格式的不同组合float32 float64等...... MATLAB在这个特定的位置,没有什么可以读取5个字节而不是4个字节.
编辑:根据克里斯的答案解决它.我正在使用此命令打开文件.
fid = fopen(fname,'rt');
Run Code Online (Sandbox Code Playgroud)
我用它替换了它
fid = fopen(fname,'r');
Run Code Online (Sandbox Code Playgroud)