@Bernhard sagte in Unklarer Fehler:
Was für andere "grausige Sachen" mache ich denn?
Wie gesagt - poste vollständigen kompilierbaren Code dann bekommst Du eine erschlagendeöpfende Liste.
Warum Dein Code nicht funktioniert? fgets() speichert - wenn Platz dafür ist - auch das die Zeile abschließende newline ('\n'). Wenn Du also nach einer Eingabe Hausnummer "42\0" suchst wirst Du nie fündig werden weil Du ständig mit "einezahl\n\0" (zB. "42\n\0") vergleichst. Entferne das von fgets() gespeicherte '\n' und es wird funktionieren:
#include <iterator> // std::size()
#include <cstring> // std::strlen(), std::strcmp()
#include <cstdio>
constexpr std::size_t max_line{ 20 };
char const * const input_filename{ "daten.txt" };
char const * const output_filename{ "$daten.txt" };
void delete_line()
{
auto input_file{ std::fopen("daten.txt", "r") };
if (!input_file) {
std::fprintf(stderr, "Eingabedatei \"%s\" konnte nicht zum Lesen geoeffnet werden :(\n\n", input_filename);
return;
}
auto output_file{ std::fopen("$daten.txt", "w") };
if (!output_file)
{
std::fprintf(stderr, "Ausgabedatei \"%s\" konnte nicht zum Schreiben geoeffnet werden :(\n\n", output_filename);
std::fclose(input_file);
return;
}
std::printf("Welche Zahl wollen Sie loeschen? ");
char line_to_find[max_line + 1];
if (!fgets(line_to_find, static_cast<int>(std::size(line_to_find)), stdin)) {
std::fputs("Input error :(\n\n", stderr);
std::fclose(input_file);
std::fclose(output_file);
return;
}
auto line_to_find_length{ std::strlen(line_to_find) };
if (line_to_find_length && line_to_find[line_to_find_length - 1] == '\n')
line_to_find[line_to_find_length - 1] = '\0';
char line[max_line + 1];
while (fgets(line, static_cast<int>(std::size(line)), input_file)) {
auto line_length{ std::strlen(line) };
if (line_length && line[line_length - 1] == '\n')
line[line_length - 1] = '\0';
else fprintf(stderr, "Es waeren noch mehr Daten in der Zeile beginnend mit \"%s\" gewesen. Dein Programmdesign ist flawed.\n\n", line);
if (std::strcmp(line, line_to_find))
fprintf(output_file, "%s\n", line);
else printf("\"%s\" wird nicht in die Ausgabedatei geschreieben.\n", line);
}
std::fclose(output_file);
std::fclose(input_file);
std::remove(input_filename);
std::rename(output_filename, input_filename);
}
int main()
{
delete_line();
}
Aber:
@DirkB sagte in Unklarer Fehler:
Eine Funktion macht die Aufgabe, nach der sie auch benannt wurde.
Nicht mehr.
Siehe auch SRP.