c - 字符数组在文件处理中不起作用

标签 c arrays file-io

我想做的是,创建一个程序,要求用户输入他想写多长的文本。之后,他在控制台中编写的任何内容都会自动保存在代码中提到的路径中名为 file 的文本文件中。因此,为了询问用户字符数组的大小,我使用了int i。然后使用gets命令来获取他写的任何内容,因为它包含空格和其他字符。但代码似乎不起作用,它询问用户有多少个字符,然后运行完成并终止。还告诉我应该做什么才能让它在每次用户启动程序时在 Data 文件夹中创建一个新文件?我不想覆盖现有文件或向其中添加文本。我想创建一个新文件,让用户随意命名,然后将该文本存储在该新文件中。

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

int main()
{
FILE *file = fopen("C://Users//Abhimanyu Aryan//Desktop//Data//Hello.txt", "w");

printf("\t\tThis program allows you to write detailed data\n\n\n");

int c;
printf("you many characters file you want to write? Specify: ");
scanf("%i",&c);

printf("\n\nEnter your text here: ");

char text[c];

gets(text);


fprintf(file, "%s" , text);

printf(" the file has been written succesfully!!!!");

fclose(file);

return 0;

}

最佳答案

您的代码有一些问题。首先,您应该检查 fopen() 的返回值以确保一切成功:

FILE *file = fopen("C://Users//Abhimanyu Aryan//Desktop//Data//Hello.txt", "w");
if (file == NULL) {
    /* Handle fopen() error */
    fprintf(stderr, "Couldn't open file for writing!");
    exit(EXIT_FAILURE);
}

第二个错误是您使用了gets()gets() 已经过时、已弃用且不安全,您永远不应该使用它。使用 fgets() 代替:

char text[c];

fgets(text, sizeof text, stdin);

如果你想让用户选择文件名,首先要询问他,然后打开指定的文件名进行写入。如果文件不存在,则会自动创建:

#define MAX_FILENAME_LENGTH 128

char filename[MAX_FILENAME_LENGTH];
printf("Enter filename (max. %zu characters): ", sizeof(filename)-1);
fgets(filename, sizeof filename, stdin);

FILE *file = fopen(filename, "w");
if (file == NULL) {
    /* Handle fopen() error as mentioned above*/
}

更新:

请注意,scanf("%i", &c); 将在缓冲区中留下换行符(从按 ENTER 键时开始)。这就是为什么 fgets() 不等待就过早返回的原因:它从先前的输入中读取缓冲区中留下的换行符,并假设您已完成(fgets 当它遇到新队)。要修复此问题,您必须在调用 scanf() 之前使用缓冲的换行符。您可以使用 getchar() 来执行此操作,例如:

/* ... */
scanf("%i",&c);
/* Consume newline left on buffer from scanf */
if (getchar() == '\r')
    (void) getchar();
printf("\n\nEnter your text here: ");
/* ... */

if (gethcar() == '\r') 的作用是在 stdin 被重定向到以 DOS 结尾的文件的情况下使代码正常工作-of-lines(\r\n 而不仅仅是 \n),在这种情况下必须消耗 2 个字符。即使您打算仅从终端使用它(没有 stdin 重定向),我仍然建议保持这种方式 - 按 ENTER 可能会将 \r\n 推送到 stdin 也是如此。

关于c - 字符数组在文件处理中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22421799/

相关文章:

c - 将 uint8_t 数组参数传递给除 uint32_t 之外的子例程(从 uint8_t 数组转换为 uint32_t 数组)

c++ - 什么是 Bison,它为什么有用?

c - 在字符串中查找字符

php - 比较值在 Php 数组中的位置

python - 为什么numpy的效率不成比例

c - 如何使用 tcp/ip 将文件及其文件名从客户端发送到服务器?

c++ - 在 C++ 中解析相当复杂但结构化的文件

php - 将一个文件复制到一个文件夹中的所有文件夹中?

C# Convert.ToInt16(String) C 等价物

Java 为 ComboBox 赋值