fgets() 没有被执行
fgets() is not being executed
我一直在尝试编写一个程序,允许用户以读取、写入或追加模式打开 .txt 文件,然后编辑其内容。
到目前为止,当我 运行 程序时,它能够以任何选定的模式打开文件,但是最后一个 if 语句中的代码位似乎没有被执行。我已经尝试了一些东西,但一直无法让它工作。 fopen() 函数似乎工作正常,但它之后的代码位不是 运行.
谁能告诉我为什么它没有被执行?
我对编码和 C 还是很陌生,所以我怀疑可能有一些我不了解的语言或计算机系统。我提前为没有注意到我的代码和逻辑中的任何明显错误而道歉。
我非常感谢所有帮助,我们将不胜感激。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "bsp10048.h"
#include <string.h>
#define MAX_EINGABE 80
/*----- Dateiöffner und Editor -----*/
int main(void)
{
FILE* file_ptr;
char str[200], selection[2], mode[2], name[200];
int repeat = 1;
printf("\nPlease enter filename: ");
fgets(name, 200, stdin);
name[strcspn(name, "\n")] = 0;
strcat(name, ".txt");
printf("\n''r'' = Read-mode (Open file for reading)");
printf("\n''w'' = Write-mode (Create file for writing)");
printf("\n''a'' = Append-mode (Open file for appending)");
/*MODE SELECTION*/
while (repeat) {
printf("\n\nBitte Modus waehlen: ");
fgets(selection, 2, stdin);
switch (selection[0]) {
case 'r':
/*Lesemodus*/
strcpy(mode, "r");
printf("\nRead-mode selected\n");
repeat = 0;
break;
case 'w':
/*Schreibemodus*/
strcpy(mode, "w");
printf("\nWrite-mode selected\n");
repeat = 0;
break;
case 'a':
/*Appelliermodus*/
strcpy(mode, "a");
printf("\nAppend-mode selected\n");
repeat = 0;
break;
default:
printf("\nInvalid mode!");
break;
}
}
if ((file_ptr = fopen(name, mode)) != NULL) {
printf("File successfully opened!");
}
if (mode != "r") {
fgets(str, 200, stdin);
while (str[0] != '\n') {
fprintf(str, 200, file_ptr);
fgets(str, 200, stdin);
}
}
fclose(file_ptr);
exit(0);
}
您的代码中存在多个问题。
- 比较字符串:
if (mode == "r")
您不能通过与字符串文字进行比较来比较字符串。这将比较地址并且很可能永远不会相同。
该条件将始终为真,因为两个字符串不能具有相同的地址。
您可以重温您的学习 material 并检查字符串的正确处理方式。
改用strcmp
:
if (strcmp(mode,"r") != 0)
- 写入输出:
fprintf(str, 200, file_ptr);
ShadowRanger 在评论中已经提到,这是错误的。您应该收到有关该行的一些警告。你用 fwrite
.
弄乱了 fprintf
参数
改用这个:
fprintf(file_ptr,"%s\n", str);
- 使用调试器观察你的程序做了什么。
您声称 if
部分中的 fgets
从未执行过。事实并非如此。
您的代码中有这一行:
fgets(selection, 2, stdin);
这将从 stdin
中只读取 1 个字节,并使用第二个字节来终止 0 字节。
任何其他字符,包括 \n
都留在缓冲区中。
如果你再过来:
fgets(str, 200, stdin);
while (str[0] != '\n') {
您只会将一个 \n
读入 str
,您的 while
条件将立即变为 false
。
您应该提供足够的 space 来消耗上面 fgets
调用中的 \n
。
旁注:
如果该条件在第一次迭代时尚未 false
,您可能会由于将无效参数传递给 fprintf
而面临分段错误,如前所述。
我一直在尝试编写一个程序,允许用户以读取、写入或追加模式打开 .txt 文件,然后编辑其内容。
到目前为止,当我 运行 程序时,它能够以任何选定的模式打开文件,但是最后一个 if 语句中的代码位似乎没有被执行。我已经尝试了一些东西,但一直无法让它工作。 fopen() 函数似乎工作正常,但它之后的代码位不是 运行.
谁能告诉我为什么它没有被执行?
我对编码和 C 还是很陌生,所以我怀疑可能有一些我不了解的语言或计算机系统。我提前为没有注意到我的代码和逻辑中的任何明显错误而道歉。 我非常感谢所有帮助,我们将不胜感激。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "bsp10048.h"
#include <string.h>
#define MAX_EINGABE 80
/*----- Dateiöffner und Editor -----*/
int main(void)
{
FILE* file_ptr;
char str[200], selection[2], mode[2], name[200];
int repeat = 1;
printf("\nPlease enter filename: ");
fgets(name, 200, stdin);
name[strcspn(name, "\n")] = 0;
strcat(name, ".txt");
printf("\n''r'' = Read-mode (Open file for reading)");
printf("\n''w'' = Write-mode (Create file for writing)");
printf("\n''a'' = Append-mode (Open file for appending)");
/*MODE SELECTION*/
while (repeat) {
printf("\n\nBitte Modus waehlen: ");
fgets(selection, 2, stdin);
switch (selection[0]) {
case 'r':
/*Lesemodus*/
strcpy(mode, "r");
printf("\nRead-mode selected\n");
repeat = 0;
break;
case 'w':
/*Schreibemodus*/
strcpy(mode, "w");
printf("\nWrite-mode selected\n");
repeat = 0;
break;
case 'a':
/*Appelliermodus*/
strcpy(mode, "a");
printf("\nAppend-mode selected\n");
repeat = 0;
break;
default:
printf("\nInvalid mode!");
break;
}
}
if ((file_ptr = fopen(name, mode)) != NULL) {
printf("File successfully opened!");
}
if (mode != "r") {
fgets(str, 200, stdin);
while (str[0] != '\n') {
fprintf(str, 200, file_ptr);
fgets(str, 200, stdin);
}
}
fclose(file_ptr);
exit(0);
}
您的代码中存在多个问题。
- 比较字符串:
if (mode == "r")
您不能通过与字符串文字进行比较来比较字符串。这将比较地址并且很可能永远不会相同。
该条件将始终为真,因为两个字符串不能具有相同的地址。
您可以重温您的学习 material 并检查字符串的正确处理方式。
改用strcmp
:
if (strcmp(mode,"r") != 0)
- 写入输出:
fprintf(str, 200, file_ptr);
ShadowRanger 在评论中已经提到,这是错误的。您应该收到有关该行的一些警告。你用 fwrite
.
fprintf
参数
改用这个:
fprintf(file_ptr,"%s\n", str);
- 使用调试器观察你的程序做了什么。
您声称 if
部分中的 fgets
从未执行过。事实并非如此。
您的代码中有这一行:
fgets(selection, 2, stdin);
这将从 stdin
中只读取 1 个字节,并使用第二个字节来终止 0 字节。
任何其他字符,包括 \n
都留在缓冲区中。
如果你再过来:
fgets(str, 200, stdin);
while (str[0] != '\n') {
您只会将一个 \n
读入 str
,您的 while
条件将立即变为 false
。
您应该提供足够的 space 来消耗上面 fgets
调用中的 \n
。
旁注:
如果该条件在第一次迭代时尚未 false
,您可能会由于将无效参数传递给 fprintf
而面临分段错误,如前所述。