Why does the name of a source file affect compilat

2019-01-20 07:58发布

I came across something really weird when I wrote a little lotto program in C++ called "lotto.cpp". Everything was fine until I wrote the write-to-file for my program. When I compiled, it showed me the following error:

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

By coincidence, I changed the name of my program to "1.cpp", and all of a sudden it compiled without problems. It also worked when I changed the name to "test.cpp".

I am really curious as to why this happened. Any Ideas?

This happened on a MacBook Pro.

If you want the code as well, just let me know!


I know some people asked for the code. Here it is:

#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;  
}

4条回答
Fickle 薄情
2楼-- · 2019-01-20 08:40

Error number 21 (on MacOS X 10.7.2) is EISDIR: Is a directory.

The name lotto seems to be a directory, not a file.

查看更多
够拽才男人
3楼-- · 2019-01-20 08:42

Yeah I ran into this problem by copying some of my visual studio code to my mac. It seems Visual Studio likes to create folders inside your project with your executable name which causes this!

查看更多
一夜七次
4楼-- · 2019-01-20 08:50

This is a linker error that states that we cannot write to the 'lotto' file on your computer while compiling. My guess is that either your program is still running, or you accidentally created a directory called 'lotto'. It's possible that your write-to-file function is keeping the application running, or itself tried to create a lotto directory.

查看更多
贼婆χ
5楼-- · 2019-01-20 08:56

FWIW I got this error when I was trying to write my output file into a directory that hadn't been created yet, i.e. bin/myprogram.

Once I created the bin directory everything was fine; I didn't have to re-name anything. GCC seems to create the directory if it doesn't exist, whereas clang doesn't (at least thats as near as I can tell).

查看更多
登录 后发表回答