Tag: file io

使用fgets读取文件并在屏幕上打印其内容

我仍然认为自己是CI中的一个新的webby我试图读取文件,文件不是二进制,但它的大小从feb kbs的小尺寸到feb Mbs的大尺寸文件不等。我正在使用fgetsfunction,我已经参考了从这个链接,但编译后,我得到分段fault.i试图用gdb调试它,发现我能够打开文件,但无法读取。这是我的代码。 #include #define MAX_LENGTH 1048576 int main() { FILE *fp; char *result; char line[MAX_LENGTH]; fp =fopen(“/home/shailendra/sampleprograms/C/shail1.txt”,”r”); if(result=fgets(line,MAX_LENGTH,fp) != NULL) printf(“The string is %s \n”,result); else printf(“Error opening the file”); if(fclose(fp)) printf(“fclose error”); } 这个分段错误真的很糟糕。我明白这是由于内存分配不足但我使用了MAX_LENGTH 1048576,所以我不认为它必须造成任何问题。我曾用两个只有一行的小文件试过它和一个多行的大文件,但我无法弄清楚为什么我得到分段错误。 我也看了这个 ,但没有得到帮助。

读取字符0x1A时发生文件结束

我正在尝试读取一个大约1000个字符的文件。 遇到0x1A字符时,文件读取终止。 我要那个: 0x1A不应该终止读数。 0x1A应该像普通字符一样存储。 我可以使用另一种方法来读取文件吗? int main(void) { int x=0,ch = ‘ ‘, file_name[25], arr[1000]; FILE *fp; printf(“Enter the name of file you wish to see\n”); gets(file_name); fp = fopen(file_name, “r”); // read mode if (fp == NULL) { perror(“Error while opening the file.\n”); exit(EXIT_FAILURE); } printf(“The contents of %s file are :\n”, file_name); […]

在C中读取文件时跳过一行

我有一个问题,我没有找到一个有效的解决方案。 这很容易,但我不明白该怎么做。 我有一个包含一些行的文件,例如: \#comment \#comment icecream 5 pizza 10 pie 7 \#comment tortillas 5 fajitas 5 我希望我的程序只读取不以#开头的行。 FILE *pf; char first [20], second [20]; pf = fopen(“config.conf”, “r”); if (pf) { while (! feof(pf)) { fscanf(pf, “%s \t “, first); while(!strcmp(first,”#”)){ `HERE I NEED JUMP TO NEXT LINE` fscanf(pf, “%s \t “, first); } fscanf […]

如何获取此readdir代码示例以搜索其他目录

我目前正在使用一个代码示例,最初设计用于获取参数,然后在当前目录中搜索该参数,我试图通过替换“。”来搜索另一个目录(/ dev / shm to exact)。 “ 使用“/ dev / shm”但是当我搜索某些内容时代码没有任何内容*(请注意通配符)。 外卡搜索在当前目录中工作正常,所以我不认为这是外卡是问题,如果有人可以帮助我,虽然我真的很感激,谢谢! #include #include #include #include static void lookup(const char *arg) { DIR *dirp; struct dirent *dp; if ((dirp = opendir(“.”)) == NULL) { perror(“couldn’t open ‘.'”); return; } do { errno = 0; if ((dp = readdir(dirp)) != NULL) { if (strcmp(dp->d_name, arg) != […]

混合fdopen()和open() – >坏文件描述符

int source = open(“hi”, O_CREAT | O_RDONLY); int dest = open(“resultfile”, O_CREAT | O_RDWR | O_TRUNC); FILE* source1 = fdopen(source, “r”); FILE* dest1 = fdopen(dest, “w+”); // outside of a testcase I would write something into ‘resultfile’ here close(source); close(dest); fclose(source1); fclose(dest1); int sourcef = open(“resultfile”, O_RDONLY); printf(strerror(errno)); // <— Bad file descriptor 我不明白为什么? 如何成功地将基于流的IO与open()混合使用? […]

使用fscanf()使用C解析逗号分隔文件

我有一个数据类似的文件 – Name, Age, Occupation John, 14, Student George, 14, Student William, 23, Programmer 现在,我想读取数据,使每个值(例如Name,Age等)作为字符串读取。 这是我的代码片段 – …. if (!(ferror(input_fp) || ferror(output_fp))) { while(fscanf(input_fp, “%30[^ ,\n\t]%30[^ ,\n\t]%30[^ ,\n\t]”, name, age_array, occupation) != EOF){ fprintf(stdout, “%-30s%-30s%-30s\n”, name, age_array, occupation); } fclose(input_fp); fclose(output_fp); } …. 然而,这进入无限循环,给出一些随机输出。 这就是我理解input conversion specifiers 。 %30[^ ,\n\t] – >读取一个长度最多为30个字符的字符串 不包括空格,逗号,换行符或制表符。 我正在阅读3个这样的字符串。 我哪里错了?

在C / C ++中有效地从结构化文件中读取数据

我有一个文件如下: 该文件由两部分组成:标题和数据。 数据部分被分成相同大小的页面。 每个页面都包含特定指标的数据。 可能需要多个页面(不需要连续)来保存单个度量的数据。 每个页面都包含页眉和页面正文。 页眉具有称为“下一页”的字段,该字段是保存同一度量的数据的下一页的索引。 页面正文包含真实数据。 所有页面都具有相同和固定的大小(标题为20个字节,正文为800个字节(如果数据量小于800个字节,则将填充0))。 标题部分由20,000个元素组成,每个元素都有关于特定度量的信息(点1 – >点20000)。 元素具有称为“第一页”的字段,该字段实际上是保存度量数据的第一页的索引。 该文件最大可达10 GB。 要求:在最短的时间内重新排序文件的数据,即,保存单个度量的数据的页面必须是连续的,并且根据字母顺序从度量1到度量20000(标题部分必须相应地更新)。 一种明显的方法:对于每个指标,读取指标的所有数据(逐页),将数据写入新文件。 但这需要很长时间,尤其是从文件中读取数据时。 有没有有效的方法?

mmap vs O_DIRECT用于随机读取(涉及的缓冲区是什么?)

我正在实现一个支持大量密钥(2600万)的基于磁盘的哈希表。 该值被反序列化。 读取在整个文件中基本上是随机的,值小于页面大小,我正在针对SSD进行优化。 安全性/一致性不是那么大的问题(性能问题)。 我目前的解决方案涉及使用带有MADV_RANDOM | MADV_DONTNEED的mmap()文件 MADV_RANDOM | MADV_DONTNEED设置为禁用内核预取,仅根据需要按需加载数据。 我认为内核从磁盘读取到内存缓冲区,我从那里反序列化。 O_DIRECT怎么样? 如果我调用read() ,我仍然会复制到缓冲区(我反序列化),那么我可以获得任何优势吗? 在哪里可以找到有关mmap()文件所涉及的缓冲区的更多信息,并在使用O_DIRECT打开的文件上调用read() ? 我对提前读取或缓存不感兴趣。 它对我的用例没有任何帮助。

C ++相当于fscanf()?

请不要说它是fscanf(); P 我正在尝试替换这一行: if ( fscanf(fp, “P%c\n”, &ch) != 1 ) 如果我理解正确,它会尝试读入一个字符并将其存储到&ch,只要它在’P’和’\ n’之间。 是对的吗? 如果成功,它返回1(它读取的字符数)? 我正在尝试提出一个C ++版本。 有没有简单的方法来做这样的格式化读取? 或者我需要使用fstream,operator >>和嵌套的if语句吗?

c中文本模式和二进制模式的区别

在文本模式下写入/读取文件时,新行字符被转换为回车符和换行符,即\ n到\ r \ n,但在二进制模式下,这不会发生。 类似地,ASCII值26将在文本模式的文件末尾写入,但这不会在二进制模式下发生。 我知道这个问题早先在SO中提出过,但我没有找到任何这种行为的理由。 我的意思是,这种行为只是为了区分文本和二进制模式,还是有这种转换的任何特定原因,而不是在二进制模式下写入ASCII值26。