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;
}
这是我的任务,您可以在下面找到我的具体问题和我写的代码:
编写一个读取字符串并将其写入文件的程序。字符串必须是动态的 分配并且字符串可以是任意长度。读取字符串后,将其写入 文件。字符串的长度必须先写,然后是冒号(':'),然后是字符串。该程序 当用户在行中输入一个点 (‘.’) 时停止。
例如:
用户输入: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;
}