-1

このプログラムを実行すると。ファイル記述子は-1値を返すため、プログラムは終了します。なぜこれが起こっているのかわかりません。pid 値は、開きたいファイルの名前とまったく同じです。

const char *psyn = "product/productId:";
char line[100];
pFile = fopen ("pids.txt" , "r");
 if (pFile == NULL) perror ("Error opening file");
else {
    while(fgets (line , sizeof(line) , pFile))
        {
        if (strstr(line, psyn) == line)
            {
            leng = strlen(line);
                    if( line[leng-1] == '\n' )
                        line[leng-1] = 0;
                    if( line[0] == '\n' )
                        line[0] = 0;
            pid = line+strlen(psyn)+1;
                            strcat(pid,t);

            leng = strlen(pid);
                    if( pid[leng-1] == '\n' )
                        pid[leng-1] = 0;

            fd = open(pid, O_RDWR, 0644);
              if (fd == -1)
                               cout<<"eror in file \n";
               else { //.. rest of the program}
4

1 に答える 1

0

pid = line+strlen(psyn)+1;
私の疑惑を引き起こしました。ここで最初の strlen() は効率的ではありません。2 番目の +1 は、文字列よりも 1 つ長くなります。

  
int opt_verbose; // -v オプションから

    char pyn[] = "製品/製品 ID:"; // ポインタではなく配列
    文字行[100];
    FILE *pFile = fopen ("pids.txt" , "r");
     if (pFile == NULL) perror ("ファイルを開く際のエラー");
    そうしないと {
        while(fgets (行、sizeof(行)、pFile))
        {
            char *s = strstr(行、psyn);
            if ( s == 行)
            {
                int の長さ;
                for ( 長さ = strlen(行);
                      長さ > 0 && isspace(行[長さ-1]);
                      長さ--)
                  line[長さ-1] = '\0';

                char *pid = 行 + sizeof(psyn) - 1; // \0 なしの sizeof
                strcat(ピッド、t);
                長さ = strlen(pid);
                if( pid[長さ-1] == '\n' )
                    pid[長さ-1] = 0;

                if ( opt_verbose )
                    printf( "詳細: %s を開く\n", pid );
                int fd = open(pid, O_RDWR, 0644);
                もし (fd == -1)
                { // 通常、perror は十分に詳細ではありません
                    printf( "エラー: \"%s\" のオープンに失敗しました: (%d) %s\n",
                                        pid、errno、strerror(errno) );
                           // \"%s\" は、パス内の予期しないスペースをうまく表示します。
                    継続する;
                }
于 2013-06-22T13:02:29.213 に答える