C中的安全文件删除 我需要安全删除C中的文件,这是我做的: 使用fopen来获取文件的句柄 使用lseek / ftell计算大小 根据当前时间/或文件大小获取随机种子 从一个循环中将(size)字节写入文件,每次迭代写入256字节 fflush / fclose文件句柄 重新打开文件并重新执行步骤3-6 10到15次 重命名该文件,然后将其删除 这是怎么做的? 因为我在橡皮擦中读到了“Gutmann 25 pass”的名字,所以我猜25是文件被覆盖的次数,’Gutmann’是随机化算法?
#include #pragma pack(push) #pragma (1) typedef struct contact { char firstname [40]; char lastname [40]; char address [100]; char phone[10]; }contact; #pragma pack(pop) int main () { FILE *pFile; contact entry = {“”, “”, “”, “”}; char choice; pFile = fopen(“C:\\contacts.txt”, “w+”); if(!pFile){ printf(“File could not be open”); return 1; } printf(“Choose a selection\n\n”); printf(“1. […]
是否有使用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编程的新手,这是作业的一部分。 我试图以以下格式读取逗号分隔的文本文件: [value1], [value2] 在C中并尝试将它们作为string和int参数传递给函数。 我已经尝试过使用sscanf()甚至使用fgetc()进行操作而没有太多帮助。 逗号之后的空格被certificate是一个问题。 例: 2001, 102 1314, 78 0410, 910 … 请帮帮我。 谢谢。
有很多方法描述如何使用各种方法在此站点上打印文本文件的行: Posix风格 , 读取IP地址 , 固定线长 。 它们似乎都是根据具体的例子量身定做的。 如果能够使用最清晰 , 最简洁和最简单的方法,那就太棒了: 将任何文本文件的每一行打印到屏幕上。 优选地详细说明每条线的作用。 简洁明了的要点。
以下代码输出“非法搜索”: #include #include #include int main() { errno = 0; getchar(); getchar(); getchar(); ftell( stdin ); printf( “%s\n”, strerror(errno) ); } 当我运行“cat script | ./a.out”以及运行“./a.out”时,会发生这种情况。 问题在于ftell,当然。 我的问题是:为什么会发生这种情况? 我认为stdin可以寻找。 fseek也会导致同样的错误。 如果stdin不可寻找,有什么方法可以做同样的事情吗? 谢谢您的回复。
一个简单的问题: 我需要在我的程序中添加一些日志记录。 如果两个进程在同一个文件上使用“fwrite”但文件描述符不同,那么写入的日志消息将是primefaces的或混合的。 有长度限制吗? 是否定义了ANSI-C行为或实现定义? 如果后来MacOSX,Linux和Windows MSVC上有什么?
这是代码 : int main() { struct vinnaren { char vinnare[20]; int artal; }; struct vinnaren v[10]; int inputrader; int antalrader; //I want antalrader to be equal to the first //line in test.txt(the first line is “5”) char file_name[256] = “test.txt”; char buf[512]; FILE *f = fopen(file_name, “r”); if (!f) { exit(0); } while (fgets(buf, sizeof […]
是否可以将整个结构写入文件 例: struct date { char day[80]; int month; int year; };
我知道ANSI C定义了fopen,fwrite,fread,fclose来修改文件的内容。 但是,在截断文件时,我们必须转向操作系统特定的function,例如Linux上的_chsize_s_() ,Windows上的_chsize_s_() 。 但在我们调用那些特定于操作系统的函数之前,我们必须通过调用fileno来获取FILE指针的文件句柄,也就是非ANSI-C函数。 我的问题是:截断文件后继续使用FILE*是否可靠? 我的意思是,ANSI C FILE层有自己的缓冲区,不知道文件是从下面截断的。 如果缓冲的字节超出截断点,那么在执行fclose()是否会将缓冲的内容刷新到文件中? 如果不能保证,在编写Windows-Linux可移植程序时,使用文件I / O函数和截断操作的最佳做法是什么? 类似的问题:当从fileno返回的文件句柄查询文件大小时,它是否是我稍后调用fclose()时的准确大小 – 没有进一步的fwrite() ? [编辑2012-12-11] 根据约书亚的建议。 我得出结论,当前可能的最佳实践是:通过调用setbuf(stream, NULL);将流设置为无缓冲模式setbuf(stream, NULL); ,然后truncate()或_chsize_s()可以与流和平地工作。 无论如何,没有官方文档似乎明确证实了这种行为,无论是Microsoft CRT还是GNU glibc。