Tag: fread

使用%s打印字符串会打印错误数据

我正在使用fread函数从文件读取字符串然后打印字符串。 我将字符串定义为具有LONGNUM大小(预定义值)的字符数组。 我每次读1个字节1个字节的大小。 当打印字符串时:printf(“读取的字符串是:%s \ n”,缓冲区); 输出是:读取的字符串是b我没有得到它,为什么在stringi的最后得到这个值? 当打印字符串时:printf(“读取的字符串是:%c \ n”,缓冲区[0]); 我得到没有值的写输出。 请解释我原因。 代码是 #include #define LONGNUM 1 void main(int argc,char *argv[]) { FILE * src; FILE * dst; int num; char buffer[LONGNUM]; // argc is the number of the elements in argv // the first argv element is the name of the program if(argc < […]

在C中使用fread和fwrite的问题

以下是我的代码,将一些硬编码的int值(1,2,3,4,5)写入文件,关闭该文件,在读取模式下打开同一文件并读取写入的元素。 从输出中看到fwrite正常发生但fread无法正确读取。 #include int main() { FILE *fptr; FILE *optr; const char *filepath = “E:\\testinput.txt”; int buf[5]={1,2,3,4,5}; int obuf[5]; int value; int *ptr = &value; int num_bytes_read; int no_of_iterations; int i; int ret;//return value for fwrite int count = 0; no_of_iterations = 5; //open the file fptr = fopen(filepath, “wb”); if(fptr == NULL){ printf(“error in […]

为什么fread()停在一个0的字符串?

我正在尝试使用以下二进制配置读取二进制文件 00 00 00 1A 79 20 83 DB 44 … 使用以下function static BitArray getBitArray(string filename) { FILE *fs = fopen(filename.data(),”r”); fseek (fs , 0 , SEEK_END); unsigned long s = ftell (fs); rewind (fs); unsigned char *buffer = new unsigned char[s+1]; fread(buffer,1,s,fs); BitArray bArray; for(int i=0; i<s; i++) bArray.add(buffer[i]); delete[] buffer; fclose(fs); return bArray; […]

我需要从一个我们不知道矩阵尺寸的文件中读取矩阵

我有这样的结构 struct Data { int ID; double test_sample[2065][1]; int XX_row; int XX_col double **XX; //size=[2065][changing] double **alpha_new; //size=[changing][1] int alpha_new row; int alpha_new_col; double t3; double kernel_par; }person[20]; 我使用fwrite为每个人(20人)写了这个结构到20个文件: fwrite(&person, sizeof( struct Data ), 1,Ptr ); 现在我有20个二进制文件。 每个文件包含一个人的这些变量。 一切都好了。 问题:由于在每个文件中, XX和alpha_new矩阵的维度不同 ,我无法读取文件并将其识别为敲击文件。 (在文件[2065] [8]中,其中一些[2065] [12]) 我需要使用fread (或不同的)读取这些变量并输入到人脸识别程序……有没有办法在文件中单独读取变量或者我是否应该更改写入方法? 我不知道如何在不使用struct的情况下将所有变量矩阵写入一个文件中! 我希望我能在这里解释我的问题,抱歉我的英语不好,我等着你的帮助完成我在c的最后项目; 我正在使用visual studio 2012

C fread二进制数并将其转换为Ascii代码

我正在尝试从文件中读取以下二进制文件(01100001)并将其转换为ascii代码(97),但是当使用fread时,我得到了一个非常大的数字。 文件“c:/input.txt”只包含以下行-01100001 printf的数组值打印大数字,如825241648 我的代码: int main() { unsigned int arr[8]; int cnt,i,temp=0; FILE * input; if(!(input=fopen(“C:/input.txt”,”r”))) { fprintf(stderr,”cannot open file\n”); exit(0); } cnt = fread(arr,1,8,input); for(i=0;i<cnt;i++) { printf("%d\n",arr[i]); } return 0; } 知道为什么吗?

为什么移动缓冲区指针会减慢fread(C编程语言)?

我正在使用C中的fread读取1 GB文件。我正在使用以下循环以1MB块读取文件: FILE *fp; fp = fopen(filename, “rb”); unsigned char* buf; buf = malloc(CHUNK_SIZE); for(i = 0; i < NUMBER_OF_CHUNKS; ++i) { fread(buf, CHUNK_SIZE, 1, fp); //Do something with contents of buffer } fclose(fp); 以这种方式读取文件大约需要2秒钟。 但是,我决定我想为整个文件的内容分配一个大缓冲区,并在每次迭代时在fread函数内“移动缓冲区指针”,如下所示: FILE *fp; fp = fopen(filename, “rb”); unsigned char* buf; buf = malloc(CHUNK_SIZE * NUMBER_OF_CHUNKS); for(i = 0; i < […]

如何在C中使用fread?

我的文本文件包含以下内容: 12345678901222344567 然后我用这段代码来阅读内容: FILE * pFile; int c; char buffer [256]; pFile = fopen (“myfile.txt”,”r”); int a[50] = {0}; fread(a, sizeof(a[0]), 5, pFile); fclose(pFile); for (c = 0; c < 5; c++) { printf("%d\n", a[c]); } 我得到了结果: 我无法解释自己为什么会得到这样的结果。

C:使用fread()/ fgets()而不是fgetc()(块I / O与字符I / O)逐行读取文本文件(带有可变长度行)

是否有使用fread (块I / O)而不是fgetc (字符I / O)的getline函数? 通过fgetc逐个字符地读取文件会有性能损失。 我们认为为了提高性能,我们可以在getline的内部循环中通过fread使用块读取。 然而,这引入了读取超过行尾的潜在不良影响。 至少,这需要实现getline来跟踪文件的“未读”部分,这需要超出ANSI C FILE语义的抽象。 这不是我们想要自己实现的东西! 我们已经分析了我们的应用程序,并且由于我们通过fgetc逐个字符地消耗大型文件,因此速度慢。 通过比较,其余的开销实际上具有微不足道的成本。 我们总是按顺序读取文件的每一行,从开始到结束,我们可以在读取期间锁定整个文件。 这可能使基于fread的getline更容易实现。 那么,是否存在使用fread (块I / O)而不是fgetc (字符I / O)的getline函数? 我们非常肯定它确实如此,但如果没有,我们应该如何实施呢? 更新发现了一篇有用的文章, 在C中处理用户输入 ,由Paul Hsieh撰写。 这是一个基于fgetc的方法,但它有一个有趣的讨论替代方案(从有多糟糕的开始,然后讨论fgets ): 另一方面,来自C程序员的常见反驳(即使是那些经验丰富的程序员)也就是说应该使用fgets()作为替代。 当然, fgets()本身并不能真正处理用户输入。 除了具有奇怪的字符串终止条件(在遇到\ n或EOF,但不是\ 0时),当缓冲区达到容量时选择终止的机制是简单地突然停止fgets()操作并且\ 0终止它。 因此,如果用户输入超过预分配缓冲区的长度, fgets()将返回部分结果。 处理这个程序员有几个选择; 1)简单地处理截断的用户输入(没有办法向用户反馈输入被截断,而他们提供输入)2)模拟一个可增长的字符数组并用连续的fgets()调用填充它。 对于可变长度的用户输入,第一个解决方案几乎总是一个非常糟糕的解决方案,因为缓冲区在大多数情况下不可避免地会过大,因为它试图捕获太多普通情况,而对于exception情况则太小。 第二种解决方案很好,只是正确实施可能很复杂。 两者都不涉及fgets在’\ 0’方面的奇怪行为。 练习留给读者:为了确定通过调用fgets()确实读取了多少字节,可以尝试扫描,就像它一样,为’\ n’并跳过任何’\ 0’而不超过传递给fgets()的大小。 解释为什么这对于流的最后一行是不够的。 ftell()的弱点是什么阻止它完全解决这个问题? 练习留给读者:通过在每次调用fgets()之间用非零值覆盖整个缓冲区来解决确定fgets()消耗的数据长度的问题。 因此,使用fgets(),我们可以选择编写大量代码并使用与C库的其余部分不一致或具有任意截止的行终止条件。 如果这还不够好,那么我们还剩下什么? […]

C编程中的freadfunction

我有两个关于C的fread函数的问题: 我已经读过fread用于读取二进制文件。 但是,当我使用读取模式”r”读取带有fgets的二进制文件和使用”rb”模式读取带有fread的文本文件时,结果与使用fgets读取文本文件和使用fread读取二进制文件相同。 那么,为什么有不同的函数来读取二进制文件和文本文件? 我正在使用fread在一次调用中读取10个字节的文件。 我应该如何在文件末尾停止阅读 – 即如何在fread指定EOF ?

C fread()神奇地读取动态分配的struct成员,怎么样?

这是我为一个我正在研究的大型项目编写的测试程序。 它与使用fwrite()将struct数据写入磁盘然后使用fread()读取该数据有关。 结构的一个成员是动态分配的。 首先,这是我的代码 #include #include #include #define STRING_LEN 128 struct Person { int age; char *name; }; int main(int argc, const char *argv[]) { struct Person *person = calloc(1, sizeof(struct Person)); person->age = 22; person->name = calloc(STRING_LEN, sizeof(char)); char *name = “Name that is really, really, really, really, really, really, long.”; strncpy(person->name, name, STRING_LEN); […]