Articles of fopen

文件描述符消失/无效

我正在使用Debian,并用C编写了一个veeeery简单文件parsing程序。我想要打开的文件长度约为32k,格式严格: number,number\n number,number\n and so on … 我的代码: int main(int argc, char* argv[]) { char data = 0; int addr = 0; char buf[50] = {0}; FILE* myfile = fopen("eelocdump.txt", "r"); if(myfile == NULL) { printf("File open error\n"); return 1; } while (fgets(buf, 50, myfile ) != NULL) { sscanf(buf, "%5d,%3d\n", &addr, &data); printf("%d,%d\n", addr, […]

为什么fopen(“any_path_name”,“r”)不能返回NULL?

在debugging一些代码时,我得到如下所示: #include<stdio.h> int main() { FILE *fb = fopen("/home/jeegar/","r"); if(NULL == fb) printf("it is null"); else printf("working"); } 这里fopen我给了一个有点有效的path名称,但不是一个文件名。 不应该fopen返回NULL呢? 但它不会返回null! 编辑: 如果我在fopen中给出path of valid directory那么它将打印working : 如果我在fopen中给出path of invalid directory那么它将打印it is null 编辑: spec说 Upon successful completion, fopen() shall return a pointer to the object controlling the stream. Otherwise, a null pointer shall be […]

当文件存在时,fopen失败

我有以下代码片段运行在一个庞大的Linux守护进程中。 我试图debugging到日志文件,但是当日志文件存在时, fopen失败 if ( ( debugFILE = fopen( "/home/lala/debug.log", "a" ) ) == NULL ) { perror("error: "); } 我得到的错误是:“权限被拒绝”。 这是特定文件的ls的输出: —-rw—- 1 lala lala 0 Mar 11 18:26 debug.log 首先,为什么这些文件是在这些权限下创build的。 其次,为什么打开时打开成功,而不打开?

fopen / fdopen冻结破碎的networking共享或移除USB设备

我正在C中为embedded式Linux设备构build一个后台服务。每小时一个文件从networking共享或USB设备读取,但是如果networking或USB设备被拔出,fopen永远不会返回并且服务冻结。 我不允许使用像pthread或fork这样的asynchronous方法来读取该文件,所以我正在寻找解决scheme,使用超时或非阻塞来testing文件(或设备)是否可用。 下面的代码示例在fopen / fdopen上冻结。 FILE* f = fopen("/path/to/file", "r"); //freezes if device not available; if(f) { < .. read file .. > fclose(f); } //////////////////////////////////////////// FILE* f = NULL; int fd = open("/path/to/file", O_RDONLY|O_NONBLOCK); if(fd>=0) { f= fdopen(fd, "r");//freezes if device not available } if(f) { < .. read file .. > fclose(f); } […]

如何使用命名pipe道在fopen上设置超时

我正在尝试使用命名pipe道在PHP中执行一些IPC。 我有一个通过创build命名pipe道 $pipePath = __DIR__ . '/pipe'; posix_mkfifo($pipePath, 0600); 完成一些计算后,还有另外一个应该写入该pipe道的进程。 我可以等待它完成,并阅读类似这样的结果: $result = file_get_contents($pipePath); 或者更详细 $in = fopen($pipePath, 'r'); $result = fread($in, 8192); fclose($in); (我已经简化了第二种方法;在实际的代码中,我会检查错误,在循环中运行fread以防结果大于8192字节等) 然而,当另一个进程完成时,我不相信它是成功的,所以我想暂时尝试读取结果。 在等待一段时间后,我想放弃并报告一个错误,说它崩溃了,等等。用这两种方法,PHP代码将永远挂起(或很长一段时间)等待一些东西写入pipe道。 具体来说, file_get_contents和fread将挂起。 我能够想出的唯一解决scheme就是这样的: $timeout = 10; //seconds for ($i = 0; $i < $timeout; $i++) { $in = @fopen($pipePath, 'rn'); if ($in) break; sleep(1); } if (!$in) { […]

在调用fclose()之后,文件可以多快用于另一个线程?

我有一个在Windows和Linux上运行的应用程序。 它创build一个文件,写入并调用fclose()。 经过一段不确定的时间后,文件的名字被发送到另一个线程。 另一个线程使用fopen()打开文件并读取其内容。 一个用户在Debian 6上报告应用程序失败,除非他在打开文件之前创build了一个短暂的延迟。 当fclose()被调用并返回时,文件通过fopen()可以被其他线程使用多快?

fopen不能在linux中使用名称中带有德语字符的文件

我写了一个代码在c,文件处理。 文件名中包含一些德文字符。 此代码在Windows上完美工作。 但是它在Linux中不起作用。 fopen给“无法打开文件”错误。 我检查了文件path,文件存在那里。 另外,我已经读取了该文件夹的写入权限。 代码如下。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char *fileName = "/users/common/haëlMünchen.txt"; FILE * pFile; char errorMessage[256]; pFile = fopen (fileName,"r"); if (pFile != NULL) { fprintf (stdout,"fopen example",errorMessage); fclose (pFile); } else { sprintf(errorMessage, "Could not open file %s", fileName); fprintf(stdout, "%s\n", errorMessage); } […]

如何启用达尔文下的大文件支持?

我有一个C应用程序,我正在为Mac OS X 10.6.4编译: $ uname -v Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386 我的gcc如下: $ gcc –version i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664) 我的Makefile如下: CC=gcc CFLAGS=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -O3 -Wformat -Wall -pedantic -std=gnu99 all: myApp rm -rf *~ myApp: myApp.o ${CC} ${CFLAGS} myApp.o -lbz2 -o myApp rm -rf *~ clean: […]

调用fopen或open时使用什么编码?

当我们在linux中像“ open ”或stdio函数一样调用系统调用时,就像' fopen '一样,我们必须提供' const char * filename '。 我的问题是这里使用的编码是什么? 这是utf-8或ascii或iso8859-x? 这取决于系统还是环境设置? 我知道在MS Windows中有一个接受utf-16的_wopen 。

是否有可能在不改变文件处理程序的情况下以共享模式打开文件?

在Python中,我使用tempfile.mkstemp打开一个临时文件进行写入,以确保文件在发布时被破坏(即使应用程序崩溃)。 现在我需要将这个文件传递给另一个应用程序,但是这个应用程序不会打开文件,只要文件打开写入。 我可以更改访问模式或重新打开文件而不更改文件句柄以防止它被过早删除吗? 更新:以读取模式打开文件不能解决问题,文件必须以shared模式打开。