Reading 从键盘读取字符串并将其写入文件

Reading reads strings from keyboard and writing them to a file

这是我的任务,您可以在下面找到我的具体问题和我写的代码:

编写一个读取字符串并将其写入文件的程序。字符串必须是动态的 分配并且字符串可以是任意长度。读取字符串后,将其写入 文件。字符串的长度必须先写,然后是冒号(':'),然后是字符串。该程序 当用户在行中输入一个点 (‘.’) 时停止。

例如:

用户输入:This is a test 程序写入文件:14:This is a test

问题:

我的代码添加了字符数和冒号,但没有添加我键入的字符串,并且在输入时添加了“.”。它不会退出

这是我目前的代码:

#pragma warning(disable: 4996)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAME_SZ 256

int main() {

    char key[] = ".";

    char *text;
    int i;

    text = (char*)malloc(MAX_NAME_SZ);

    FILE* fp;

    do {
        printf("Enter text or '.' to exit: ", text);
        fgets(text, MAX_NAME_SZ, stdin);

        for (i = 0; text[i] != '[=10=]'; ++i);

        printf("%d: %s", i);

        fp = fopen("EX13.txt", "w");

        while ((text = getchar()) != EOF) {
            putc(text, fp);
        }

        fclose(fp);
        printf("%s\n", text);


    } while (strncmp(key, text, 1) != 0);
    puts("Exit program");


    free(text);

    return 0;
} 

你的代码有很多问题,几乎都是错的。

只是几个问题:

  • 您使用 printf("%d: %s", i); 在屏幕上打印应该进入文件的内容。
  • 循环 while ((text = getchar()) != EOF) 没有任何意义。
  • 您将在输入第一行后关闭文件
  • 您忽略所有编译器警告
  • 结束条件 while (strncmp(key, text, 1) != 0) 错误,您只是在测试字符串 是否以 . 开头 ,并且您也在测试它晚了。

这可能是一个开始:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAME_SZ 256

int main() {
  char* text;
  int i;

  text = (char*)malloc(MAX_NAME_SZ);

  FILE* fp;
  fp = fopen("EX13.txt", "w");
  if (fp == NULL)
  {
    printf("Can't open file\n");
    exit(1);
  }

  do {
    printf("Enter text or '.' to exit: ");
    fgets(text, MAX_NAME_SZ, stdin);

    if (strcmp(".\n", text) == 0)
      break;

    for (i = 0; text[i] != '[=10=]' && text[i] != '\n'; ++i);

    fprintf(fp, "%d: %s", i, text);

  } while (1);

  fclose(fp);

  puts("Exit program");
  free(text);
  return 0;
}

不过有一个限制,在此程序中最大行长度为 254 个字符,不包括换行符。据我了解,行的长度必须是任意的。

我让你自己做这个作为练习,但以你的 C 知识水平,这会很难。

我认为这应该适用于短于 255 个字符的字符串。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NAME_SZ 256


int main()
{
     
     char key[] = ".\n";
     char *text;

     text = (char*)malloc(MAX_NAME_SZ);
     if (text == NULL)
     {
             perror("problem with allocating memory with malloc for *text");
             return 1;
     }

     FILE *fp;
     fp = fopen("EX13.txt", "w");
     if (fp == NULL)
     {
             perror("EX13.txt not opened.\n");
             return 1;
     }

     printf("Enter text or '.' to exit: ");
     while (fgets(text, MAX_NAME_SZ, stdin) && strcmp(key, text))
     {
             fprintf(fp, "%ld: %s", strlen(text) - 1, text);
             printf("Enter text or '.' to exit: ");
     }

     free((void *) text);
     fclose(fp);

     puts("Exit program");

     return 0;
}