【问题标题】:C rename() file with default name in main()C rename() 文件在 main() 中具有默认名称
【发布时间】:2022-01-24 19:39:47
【问题描述】:

我想知道如何更改在 main() 中已具有固定默认名称的文件的名称。

正如您在主文件中看到的,文件的名称已经设置为 movies.dat (char dateiname[50] ="movies.dat"),我想用 case 'd' 来改变它到函数“dateiUmbenennen()”。此外,在我使用“dateiname”的任何地方都应该使用更改后的名称。

任何帮助都会很好!

这是我目前的代码:

int
dateiUmbenennen(char* pdateiname)
{
    char newName[50];

    printf("Bitte geben Sie den neuen Namen mit gewuenschtem Dateitypen ein: ");
    scanf("%s", &newName);

    int res = rename(pdateiname, newName);
    if (!res)
    {
        printf("Datei wurde erfolgreich in %s umbenannt!\n", newName);
        *pdateiname = newName[50];
    }
    else
    {
        printf("ERROR: Umbenennung fehlgeschlagen mit dem Fehler: %s!\n", strerror(errno));
    }
    return 0;
}

// ================================================================
// MAIN
// ================================================================

int main(void)
{
    // Default fuer Namen der Filmdatei
    char dateiname[50]= "movies.dat";

    // Hilfsvariablen-------------------------------------------------------------------------------------------------


    // Hilfsvariable fuer do-while-Schleife
    int stopLoop = 0;

    // Hauptschleife
    do {
        // Ausgabe des Bildschirm-Menus
        printf("\nAUSWAHL-MENU:\n");
        printf("(n)   Neuen Film eingeben\n");
        printf("(a)   Alle Filme anzeigen lassen\n");
        printf("(o)   Filmdatenbank aus Datei einlesen\n");
        printf("(s)   Filmdatenbank in Datei speichern\n");
        printf("(d)   Dateinamen fuer Lesen/Speichern festlegen (Aktuell: %s)\n",
            dateiname);
        printf("(q)   Programm verlassen\n");
        //printf("\nIhre Wahl: ");

        // Abfrage der Benutzerwahl
        char ch = _getch();
        printf("%c\n\n", ch);

        // Aktionen in Abhaengigkeit von der Benutzerwahl
        switch (ch)
            //----------------------------------------------------------------------------------------------------------------------
        {
        case 'q': // Programm verlassen
            stopLoop = 1;
            break;
        case 'n': // Neuen Film eingeben
            movieDatensatz = benutzerEingabe();
            break;
        case 'a': // Alle Filme anzeigen lassen
            konsolenAusgabe(movieDatensatz, anzahlFilme=dateiEinlesen(dateiname));
            break;
        case 'o': // Filmdatenbank aus Datei einlesen
            dateiEinlesen(dateiname);
            break;
        case 's': // Filmdatenbank in Datei speichern
            break;
        case 'd': // Dateinamen fuer Lesen/Speichern festlegen
            dateiUmbenennen(&dateiname[50]);
            break;
        case 'h':
            printf("%s", dateiname);
            break;
        default:  // keine gueltige Eingabe
            printf("==> Ungueltige Eingabe!\n");
        }

    } while (!stopLoop);

    return 0;
}

【问题讨论】:

  • 最好提供问题的minimal reproducible example,而不是发布整个代码。如果您的代码使用非英语输出和变量/函数名称,则尤其如此,因为不会说该语言的人很难理解这样的程序。
  • 提示:您只需要一个printf() 语句来显示您的整个菜单。 (或任何连续的文本块——无论包含多少 '\n' 字符)您甚至可以将格式字符串拆分为单独的行,每行都以 '\n' 结尾,因此可以根据需要写出显示菜单(相邻的字符串文字在编译过程中被组合成一个字符串......并且相邻的字符串文字之间的空格被忽略)

标签: c rename file-rename


【解决方案1】:

线

*pdateiname = newName[50];

没有任何意义——它读取了一个无效的位置(newName[50] 超出了数组的末尾)并复制了一个字符。你可能打算做的是

strcpy(pdateiname, newName);

将字符串从newName 数组复制到pdateiname 数组。

【讨论】:

  • 是的!我实际上想这样做,我现在按预期工作。谢谢你们俩。
【解决方案2】:

如果您希望函数dateiUmbenennen 更改函数main 中的数组dateiname 的内容,那么,当从main 调用函数dateiUmbenennen 时,您应该传递一个指向该数组的指针.

您似乎正试图在该行中完全这样做

dateiUmbenennen(&dateiname[50]);

但是,这是将该数组的第 51st 元素的地址(甚至不存在,因为该数组只有 50 个元素)传递给函数。这根本不符合逻辑。您应该改为传递数组开始的地址,即 1st 元素的地址。你可以这样做:

dateiUmbenennen( &dateiname[0] );

不过,更常见的是简单写

dateiUmbenennen( dateiname );

因为在此上下文中使用数组将导致数组自动decay 指向第一个元素的指针。

线

*pdateiname = newName[50];

也没有意义,因为该行将数组 newName 的(不存在的)51st 元素复制到 pdateiname 指向的任何位置(这应该是dateiname,但不在您发布的代码中)。假设pdateiname指向dateiname的开头,那么你可以使用函数strcpy复制整个字符串,如下所示:

strcpy( pdateiname, newName );

另外,我建议你换行

scanf("%s", &newName);

scanf("%49s", &newName);

这样如果用户输入超过 49 个字符,您将不会在 overflow newName 数组中。

【讨论】:

  • 确实有效!谢谢!是的,实际上我已经尝试删减很多代码以使其变得简单,但我发现我可以删减更多代码。我会记住它的未来! :)
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多