Tag: 文件

用C语言读写大文件的有效方法

我正在编写一个处理非常大的用户生成的输入文件的应用程序。 该程序将复制约95%的文件,有效地复制它并在副本中切换一些单词和值,然后将副本(以块为单位)附加到原始文件,以便每个块(包括10到50之间)在原始的行后面是复制和修改的块,然后是下一个原始块,依此类推。 用户生成的输入符合特定格式,原始文件中的任何行都不可能长于100个字符。 哪种方法更好? 要使用一个文件指针并使用保存当前位置的变量以及已写入的位置,请来回读取和写入文件指针; 要么 使用多个文件指针,一个用于读取,一个用于写入。 我主要关注程序的效率,因为输入文件最多可达25,000行,每行大约50个字符。

用C读取文件并拆分字符串

我有一个程序在C中读取文件。现在我想把字符串除以空格分成一个数组。 我该怎么做? #include int main() { char line[30]; char names[100][20]; int sizes[100]; int i = 0; FILE *fp; fp = fopen(“in.txt”, “rt”); if(fp == NULL) { printf(“cannot open file\n”); return 0; } while(fgets(line, sizeof(line), fp) != NULL) { printf(line); i++; } fclose(fp); return 0; }

如何从txt文件C制作数组

我得到了包含以下信息的文本文件: (100; 200;第一个) 。任何人都可以告诉我如何将这些信息分成三个数组: Min = 100,Max = 200,Name = first 。 我试过这个 C = GETC(INP); I =的atoi(szinput); 但它第一次读取10次,第二次读取00次……依此类推 c节省10而不是1,所以我无法获得数组的正确信息…… 因此arraysMin存储1000而不是100 谢谢。

服务器无法正确读取/打开客户端在C中发送的文件名

我正在与C中的套接字进行客户端/服务器交互。我要做的是让客户端请求在服务器上读取文件,服务器返回文件内容的缓冲区,客户端打印出来文件。 虽然我能够完成服务器向客户端发送文件缓冲区并且客户端成功打印出来,但我似乎无法让服务器成功读取客户端发送的文件名。 这就是我的意思: ///This is the structure of the message that gets sent back and forth struct message { int code; //Just indicates 1 or 2 for readfile or writefile int size; char buffer[256]; //This will hold the filename when client sends readfile request }; 作品: char *filename = “test.c”; infile = open(filename, O_RDONLY); //Send […]

c:返回目录中的所有文件名

如何编写一个函数来返回包含子目录中文件的目录中的所有文件名。 到目前为止,我有类似的东西,但它不能正常工作,我尝试调用此函数并打印出每个元素,它只打印第一个元素。 谁能告诉我我做错了什么或者写这个函数的其他方法? char **allFiles(char *dir, OPTIONS opts) { char **allfiles = malloc(sizeof(char **)); struct dirent *dp; while((dp = readdir(dirp)) != NULL) { if (strcmp(dp->d_name, “.”) == 0 || strcmp(dp->d_name, “..”) == 0) continue; if (dp->d_type == DT_DIR) allfiles = allFiles(strcat(strcat(dir, “/”), dp->d_name)); if (dp->d_type != DT_DIR) *allfiles = strdup(strcat(strcat(strdup(dir), “/”), dp->d_name)); ++allfiles; } closedir(dirp); […]

是在线程安全的不同字节范围读取和写入同一文件?

我有一个名为“data.txt”的文件,总是有50个字节的数据。 我有两个主题。 第一个线程,从字节0到字节50读取内容: while(1){ char buf[50]; FILE* fp = fopen(“data.txt”,”r”); fread(buf,1,50,fp); /* process data */ fclose(fp); } 第二个线程,将数据附加到文件(=始终在前50个字节之后): while(1){ FILE* fp = fopen(“data.txt”,”a”); fwrite(“hello\n”,1,6,fp); fclose(fp); } 这个解决方案是线程安全且可移植的吗? (没有分段错误,没有数据不一致,……)

传递给函数时,文件指针的行为会有所不同。 为什么?

所以我有这个代码 void getdata(int *q) { for(int i=0;i<3;++i) scanf("%d",q++); *q=10; } int main() { int *p,a[4]; p=a; getdata(p); printf("%d",*p); return 0; } 而且输出很明显。 7 8 9 7 但文件指针不能以相同的方式工作。 我试图编写一个基本代码,用于将数据附加到文件中。 void getdata(FILE *fp) { char ch; while((ch=getchar())!=EOF) fputc(ch,fp); rewind(fp); } void printdata(FILE *fp) { char ch; while((ch=fgetc(fp))!=EOF) putc(ch,stdout); } int main() { FILE *fp1; fp1=fopen(“music.txt”,”w+”); getdata(fp1); printf(“Text […]

如何将从文件中读取的字符串拆分为C中的数组

我有一个简单的文件,其中包含100个文件名列表及其相应的大小,如下所示: file1.txt, 4000 file2.txt, 5000 等等。如何逐行读取文件,然后将文件名列表存储到char数组中,然后将大小列表存入int数组? 我试图像这样使用sscanf,但这不起作用。 我得到一个段错误: main(){ char line[30]; char names[100][20]; int sizes[100]; FILE *fp; fp = fopen(“filelist.txt”, “rt”); if(fp == NULL){ printf(“Cannot open filelist.txt\n”); return; } while(fgets(line, sizeof(line), fp) != NULL){ sscanf(line, “%s, %d”, names[i][0], sizes[i]); printf(“%d”, sizes[i]); i++; } }

fseek到32位无符号偏移量

我正在读取一个文件格式(TIFF),它从文件的开头有32位无符号偏移量。 不幸的是fseek的原型,通常我会去特定的文件偏移,是: int fseek ( FILE * stream, long int offset, int origin ); 所以偏移是签名的。 我应该如何处理这种情况? 我应该使用不同的function进行搜索吗?

FAT32每个目录限制的文件数

我正在尝试在Xillinx Kintex 7卡上用C编码FAT系统。 它配备了MicroBlaze,我已经设法创建了大部分所需的function。 我面临的问题是关于文件夹的总容量,我在网上看到在FAT32中一个文件夹应该能够包含超过65000个文件但是我已经安装了系统我是每个文件夹限制为509个文件。 我认为这是因为我理解了FAT32的工作方式,但这是我迄今为止所做的: 我创建了一个格式化函数,它将正确的数据写入MBR(扇区0)和卷ID(我的磁盘上的扇区2048)。 我创建了一个函数来写入根目录的内容(第一个集群在扇区124 148上开始) 我创建了一个函数来编写一个包含大小为X的N个文件的新文件夹。文件夹的名称写在根目录(扇区124148)中,文件名写在下一个簇(扇区124212,因为我已经将簇大小设置为64个扇区)。 最后,文件的内容(一个简单的计数器)写在从扇区124276开始的下一个簇上。 这里的问题是文件夹的大小为1簇,这意味着它的容量为64扇区= 32KB,我只能在目录中创建512(减2)个文件! 然后,我的问题是:是否可以更改群集数量的文件夹大小? 目前我只使用1个集群,我不明白如何更改它。 它与驱动器的FAT有关吗? 在此先感谢您的帮助! 注意:当我将其插入时,Windows可以识别我的驱动器,我可以访问和读取每个文件(超出510限制的文件除外),我可以通过Windows资源管理器创建新文件。 它显然来自我理解文件创建和文件夹创建的方式!