Как избежать проблем с \ в имени файла в C?

В C#, когда вам нужно манипулировать файлами, вы можете использовать символ @, чтобы избежать изменения "\" в имени файла.

Пример:

string fileName = @"C:\Users\username\Documents\text.txt";

Но в C я не могу использовать символ @. Поэтому я должен заменить «\» на «/» или использовать «\ \»:

fopen = ("C:/Users/username/Documents/text.txt","r");

or

fopen = ("C:\\Users\\username\\Documents\\text.txt","r");

Есть ли какой-нибудь трюк в C, чтобы избежать всей этой работы?


person user9168427    schedule 26.10.2018    source источник
comment
Какая дополнительная работа связана с использованием косой черты? Это реальная проблема для вас, или вам просто интересно?   -  person Caleb    schedule 26.10.2018


Ответы (2)


По большей части не помещайте в исходные файлы абсолютные литеральные пути, особенно те, которые имеют нотацию, специфичную для Windows. Загружайте или создавайте пути из каких-либо входных данных, чтобы ваша программа не была привязана к макету файловой системы коробки, на которой вы ее разработали.

person R.. GitHub STOP HELPING ICE    schedule 26.10.2018

Вы можете написать небольшую вспомогательную функцию для преобразования всех пробелов в пробелы вперед.

void fileconvert(char *filename)
{
    while(*filename !='\0')
    {
        if (*filename == '\')
        {
            *filename = '/';
        }
        filename++;
    }
}

Вы можете использовать его, как показано ниже.

FILE *fp;
char filename[] = "C:/Users/username/Documents/text.txt";

fileconvert(filename);
fp = fopen(filename,"r");

Вероятно, так работает оператор @ в C#.

person Rishikesh Raje    schedule 26.10.2018
comment
Этот код даже не компилируется и не делает ничего подобного тому, что хочет OP. Более того, если OP не против использования косой черты, нет необходимости в каком-либо преобразовании. Windows (и DOS) всегда поддерживает косую черту. - person R.. GitHub STOP HELPING ICE; 26.10.2018
comment
см. stackoverflow.com/questions/11466139/ для косой черты. Что касается компиляции - приведенный код является фрагментом, а не полным кодом. - person Rishikesh Raje; 26.10.2018