2012-02-08 6 views
10

Me encontré con algo realmente extraño cuando escribí un pequeño programa de lotería en C++ llamado "lotto.cpp". Todo estaba bien hasta que escribí la escritura para archivo para mi programa. Cuando he realizado, me mostró el siguiente error:¿Por qué el nombre de un archivo fuente afecta la compilación?

ld: can't open output file for writing: lotto, errno=21 for architecture x86_64 
collect2: ld returned 1 exit status 

Por coincidencia, he cambiado el nombre de mi programa de "1.cpp", y, de repente, se compila sin problemas. También funcionó cuando cambié el nombre a "test.cpp".

Tengo mucha curiosidad de por qué sucedió esto. ¿Algunas ideas?

Esto sucedió en una MacBook Pro.

Si quiere el código también, ¡házmelo saber!


Sé que algunas personas pidieron el código. Aquí está:

#include <iostream> 
#include <fstream> 

using namespace std; 

const int NED = 10;    
const int VIKING = 6; 
const int NORMAL = 7; 
const int MAX = 10; 

void quickSort(int arr[], int left, int right); 
int checkDuplicates(int arr[], int length); 

int main (int argc, const char *argv[]) 
{ 
    int i, j, k, ans; 
    char ans2; 
    int lottoNumbers[MAX]; 

    ofstream out("Lotto.txt", ios::out | ios::app); 

    srand((unsigned)time(NULL));  

    do 
    { 
     do 
     { 
      cout << "\n\nDo you want to play Viking Lotto (press 6), or normal Lotto (press 7): "; 
      cin >> ans; 
     }while(ans != VIKING && ans != normal); 

     (ans == VIKING) ? cout << "\nViking Lotto:\n" : cout << "\n\nnormal Lotto:\n"; 
     (ans == VIKING) ? out << "\nViking Lotto:\n" : out << "\n\nnormal Lotto:\n"; 


     for (i = 0; i < NED; i++)  //10 rows 
     {  
      for (j = 0; j < ans; j++) //6 or 7 columns 
      { 
       (ans == VIKING) ? lottoNumbers[j] = (rand() % 48) + 1 : lottoNumbers[j] = (rand() % 34) + 1; 
      } 
      if(checkDuplicates(lottoNumbers, ans) != -1)   
      { 
       for(k = 0; k < ans; k++) 
       { 
        while(checkDuplicates(lottoNumbers, ans) == lottoNumbers[k])  
        { 
         (ans == VIKING) ? lottoNumbers[k] = (rand() % 48) + 1 : lottoNumbers[k] = (rand() % 34) + 1; 
        } 
       } 
      } 
      quickSort(lottoNumbers, 0, ans - 1); 
      cout << '\n'; 

      for(j = 0; j < ans; j++) 
      { 
       cout << lottoNumbers[j] << '\t'; 
       out << lottoNumbers[j] << '\t'; 
      } 
      out << '\n'; 

     } 
     cout << "\n\n"; 


     cout <<"Another lottery ticket (Y/N) "; 
     cin >> ans2; 
    }while(ans2 == 'j' || ans2 == 'J'); 

    cout << "\n\nLOTTO NUMBERS WAS WRITTEN TO FILE...\n\n"; 

    return 0; 
} 

void quickSort(int arr[], int left, int right) 
{ 
    int i = left, j = right; 
    int tmp; 
    int mid = arr[(left + right)/2]; 

    while (i <= j) 
    { 
     while (arr[i] < mid) i++; 
     while (arr[j] > mid) j--; 
     if (i <= j) 
     { 
      tmp = arr[i]; 
      arr[i] = arr[j]; 
      arr[j] = tmp; 
      i++; 
      j--; 
     } 
    }; 
    if (left < j) quickSort(arr, left, j); 
    if (i < right) quickSort(arr, i, right); 
} 

int checkDuplicates(int arr[], int length) 
{          
    for(int i = 0; i < length; i++) 
    { 
     for(int j = i + 1; j < length; j++) 
     { 
      if(arr[i] == arr[j]) return arr[j]; 
     } 
    } 
    return -1; 
} 
+0

Por favor ingrese el código. Parece que está editando un archivo sin permisos. – beta0x64

+0

Además, proporcione la estructura de su directorio (nombre de directorio y archivos dentro) – beta0x64

+0

El error 21 en '/ usr/include/sys/errno.h' es' EISDIR', ¿estaba tratando de escribir en un directorio? – Gaius

Respuesta

23

Número de error 21 (en MacOS X 10.7.2) es EISDIR: Is a directory.

El nombre lotto parece ser un directorio, no un archivo.

+0

¡Su señor absolutamente correcto! No me di cuenta de que tenía una carpeta con el mismo nombre que mi archivo C++, ambos ubicados en el escritorio. Tonto error por mi ... –

1

Este es un error de engarce que indica que no podemos escribir en el archivo 'lotto' de su computadora mientras compilamos. Supongo que su programa aún se está ejecutando, o accidentalmente creó un directorio llamado 'lotto'. Es posible que su función de escritura en archivo mantenga la aplicación ejecutándose o que intente crear un directorio de lotería.

+0

Aquí está el código ya que algunas personas querían echarle un vistazo: Editar: El código es demasiados caracteres: / –

1

Sí, me encontré con este problema al copiar parte de mi código de Visual Studio en mi mac. Parece que a Visual Studio le gusta crear carpetas dentro de tu proyecto con tu nombre de ejecutable, ¡lo que provoca esto!

0

FWIW Recibí este error cuando intentaba escribir mi archivo de salida en un directorio que aún no se había creado, es decir, bin/myprogram.

Una vez que creé el directorio bin todo estaba bien; No tuve que volver a nombrar nada. GCC parece crear el directorio si no existe, mientras que clang no (al menos eso es lo más aproximado que puedo decir).

Cuestiones relacionadas