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);
}

您的代码中存在多个问题。

  1. 比较字符串:
if (mode == "r")

您不能通过与字符串文字进行比较来比较字符串。这将比较地址并且很可能永远不会相同。

该条件将始终为真,因为两个字符串不能具有相同的地址。

您可以重温您的学习 material 并检查字符串的正确处理方式。

改用strcmp

if (strcmp(mode,"r") != 0)
  1. 写入输出:
fprintf(str, 200, file_ptr);

ShadowRanger 在评论中已经提到,这是错误的。您应该收到有关该行的一些警告。你用 fwrite.

弄乱了 fprintf 参数

改用这个:

fprintf(file_ptr,"%s\n", str);
  1. 使用调试器观察你的程序做了什么。

您声称 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 而面临分段错误,如前所述。