【问题标题】:C open() returns -1 for a path stringC open() 为路径字符串返回 -1
【发布时间】:2014-06-07 18:31:21
【问题描述】:

当我使用 open() 作为

int ff=open("/home/user/desktop/bla/test",O_RDONLY);

效果很好。

但是当我使用字符串作为(存储在字符串中的相同路径)路径时,它不起作用。

int ff=open(string,O_RDONLY);

这是为什么?

这是我的全部代码。我糊涂了。我知道它应该工作。但我没有。我找不到错误。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <string.h>

void bla(char *);
int main(void)
{
// int i;
FILE * fp=fopen("path","r");
char line[256];

while( fgets(line,255,fp)!=NULL){

bla(line);

 }

return 0;
}


void bla(char * line){

int status;
printf("%s",line);


pid_t pid=fork();

char string[256];
if(pid==0){

    pid=wait(&status);

    int ff=open(line,O_RDONLY);

    if(ff<0){
        printf("\topen error!\n\n");
    return;}

    int ret=read(ff,string,255);

    if(ret<0){
        printf("read error!\n");
    return;}

    printf("%s",string);
close(ff);

exit(0);


}   
if (pid>0){
        return;
}
 }

在 bla 函数中,如果我将 'line' 替换为路径,它可以工作。我用 printf 来确定。路径是一样的(看起来一样)。

【问题讨论】:

  • 你能不能说明一下'string'是如何定义和初始化的?也许:char *string="/home/user/desktop/bla/test" ???
  • 尝试使用strerror打印errno

标签: c path directory system-calls


【解决方案1】:

我称之为恶作剧:-)

显然,如果string 与您的字符串文字的值完全相同,并且所有其他内容保持不变,那么它会正常工作。

所以,如果所有其他事情都相同,string 显然没有设置为您认为的值,即"/home/user/desktop/bla/test"。 p>

我的建议是打印出来(连同错误字符串)以确保,例如:

fprintf (stderr, "DEBUG: string is [%s]\n", string);
int ff = open (string, O_RDONLY);
if (ff < 0)
    perror ("Could not open file");

而且,既然您已经发布了代码,那么您的问题就很明显了:fgets() 没有删除尾随换行符,所以,如果您添加我上面建议的代码,您会看到:

DEBUG: string is [/home/user/desktop/bla/test
]

并推断问题。

解决此问题的一种快速方法是自己删除换行符,例如:

while (fgets (line, 255, fp) != NULL) {
    size_t ln = strlen (line);             // Add these
    if ((ln > 0) && (line[ln-1] == '\n'))  //   three
        line[ln-1] = '\0';                 //   lines.
    bla (line);
}

【讨论】:

  • @udakarajd,感谢您发布代码。问题在于fgets 保留了尾随换行符这一事实。查看更新的答案。
猜你喜欢
  • 2012-01-12
  • 2020-09-23
  • 2015-08-30
  • 2021-12-27
  • 2020-11-27
  • 2016-11-23
  • 2017-10-30
  • 2013-04-12
  • 2012-05-03
相关资源
最近更新 更多