我正在读取一个文件,并希望将每一行放入一个数组中的字符串中。 文件的长度是任意的,每行的长度是任意的(虽然假设它将少于100个字符)。 这是我得到的,而不是编译。 基本上这是一个字符数组的数组,对吧? 所以不应该是char** words = (**char)malloc(sizeof(*char)); ? #include #include int main(){ int BUFSIZE = 32767;//max number of lines to read char** words = (**char)malloc(sizeof(*char));//gives error: expected expression before ‘char’ FILE *fp = fopen(“coll.txt”, “r”); if (fp == 0){ fprintf(stderr, “Error opening file”); exit(1); } int i = 0; words[i] = malloc(BUFSIZE); while(fscanf(fp, “%100s”, […]
在调用fflush之前我可以认为fwrite是=非阻塞写吗? 如果没有,为什么不,我的替代品是什么?
如果使用以下命令打开文件: FILE *f1=fopen(“test.dat”,”a+”); 手册页内容如下: A + 打开阅读和追加(在文件末尾写)。 如果文件不存在,则创建该文件。 用于读取的初始文件位置位于文件的开头,但输出始终附加到文件的末尾。 那么f1有两个独立的偏移指针,一个用于读取,另一个用于写入?
我正在通过同步调用ReadDirectoryChangesW观看目录。 当一个新文件可用时,我尝试使用GENERIC_READ和FILE_SHARE_READ CreateFile立即访问它,但这给了我ERROR_SHARING_VIOLATION 。 将文件放入监视目录的过程在我尝试读取它时没有完成写入。 有没有办法可靠地等到文件可供阅读? 我可以将方法放入如下所示的循环中,但我希望有更好的方法。 while ((hFile = CreateFile (path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_SHARING_VIOLATION) Sleep (500); else break; // some other error occurred } if (hFile == INVALID_HANDLE_VALUE) { // deal with other error return 0; } ReadFile (…);
C规范有一个有趣的脚注(#268C11dr§7.21.39) “将文件位置指示器设置为文件结尾,与fseek(file, 0, SEEK_END) ,具有二进制流的未定义行为(因为可能是尾随空字符)或具有状态相关编码的任何流不能确定在最初的轮class状态结束。“ 这是否适用于读取文件的二进制流? (从物理设备) IMO,磁盘上的二进制文件只是一个字节的海洋。 在我看来,二进制文件不能具有状态相关的编码,因为它是一个二进制文件。 我对“二进制广泛流”的概念很模糊,如果它甚至可以应用于磁盘I / O. 我看到在串口流上调用fseek(file, 0, SEEK_END)就像一个com端口或stdin可能无法达到真正的结束,因为还没有确定结束 。 从而将问题缩小到物理文件。 [编辑]答案:与老年人(可能直到20世纪80年代后期)的关注。 目前在2014年,Windows,POSIT特定和非异国他人:不是问题。 @Shafik Yaghmour提供了一个很好的参考, 使用fseek和ftell来确定文件的大小是否有漏洞? 。 @Jerry Coffin将CP / M视为二进制文件并不总是具有精确的长度。 (每个wiki 128字节的记录)。 感谢@Keith Thompson的回答。 这一点解释了规范的“(因为可能有尾随空字符)”评论。
我有一个包含多个字符串的文件,每个字符串在一个单独的行上。 所有字符串都是32个字符长(所以33个末尾有’\ n’)。 我正在尝试阅读所有字符串。 现在,我只想阅读它们而不是按如下方式存储它们: char line[32]; while (!feof(fp)) { fgets(line, 32, fp); } printf(“%s”, line); 这打印出零。 为什么不工作? 此外,我试图在每个字符串读取的末尾存储一个空终止符。 我将line数组更改为长度为33但是如果找到’\n’ ,我将如何将其替换为\0并将其存储?
我正在寻找一个关于如何在C中将文件从一个目录复制到另一个目录的简单示例。该程序应该只使用C本机的跨平台函数。
ftello / fseeko和fgetpos / fsetpos有什么区别? 两者似乎都是文件指针获取/设置function,使用不透明偏移类型有时允许64位偏移。 它们是在不同平台上支持还是由不同标准支持? 它使用的偏移类型是否更灵活? 顺便说一句,我知道fgetpos / fsetpos和ftell / fseek ,但这不是重复的。 那个问题询问ftell / fseek,答案不适用于ftello / fseeko。
只是一个简单的问题:有没有办法复制文件指针(由fopen()返回的那些),类似于dup()如何复制open()等函数返回的文件处理程序? 基本上,我希望能够做到这样的事情: FILE *fp = fopen(“some_file”, “r”); FILE *fp2 = /* do something to duplicate the file pointer */; fclose(fp); // fp2 is still open /* do something with fp2 */ fclose(fp2);
在Win32 API中,有一个字面复制文件的CopyFile 。 但是,此API不会创建文件夹。 例如,我想将C:\Data\output.txt复制到D:\Temp\Data\output.txt 。 但是,目标文件夹D:\Temp和D:\Temp\Data ‘不存在。 在这种情况下,此API失败。 是否有一个方便的API可以自动和递归地在副本上创建目录结构? 当然,我可以做这样的function,但我希望有人已经完成了这个function。