在 main() 中使用默认名称的 C rename() 文件
C rename() file with default name in main()
我想知道如何更改在 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;
}
行
*pdateiname = newName[50];
没有任何意义——它读取了一个无效位置(newName[50] 超出了数组末尾)并复制了一个字符。你可能想做的是
strcpy(pdateiname, newName);
将字符串从 newName
数组复制到 pdateiname
数组。
如果你想让函数dateiUmbenennen
在函数main
中改变数组dateiname
的内容,那么,从[=调用函数dateiUmbenennen
时19=],你应该传递一个指向该数组的指针。
你似乎正试图在行中做到这一点
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
数组。
我想知道如何更改在 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;
}
行
*pdateiname = newName[50];
没有任何意义——它读取了一个无效位置(newName[50] 超出了数组末尾)并复制了一个字符。你可能想做的是
strcpy(pdateiname, newName);
将字符串从 newName
数组复制到 pdateiname
数组。
如果你想让函数dateiUmbenennen
在函数main
中改变数组dateiname
的内容,那么,从[=调用函数dateiUmbenennen
时19=],你应该传递一个指向该数组的指针。
你似乎正试图在行中做到这一点
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
数组。