使用动态字符串的C文件I/O

使用动态字符串的C文件I/O,c,string,io,C,String,Io,我正在尝试编写一个简单的程序,它可以执行以下操作: 选择一个文件 选择要对文件执行的操作(fopen模式:r、w、a、r+…) 写入文件 这是我目前的代码: //Gets future file content printf("Write content:\n"); char content[100]; fgets(content, 100, stdin); //Selects file printf("Select output file: "); char file[30]; fget

我正在尝试编写一个简单的程序,它可以执行以下操作:

  • 选择一个文件
  • 选择要对文件执行的操作(fopen模式:r、w、a、r+…)
  • 写入文件
这是我目前的代码:

//Gets future file content
printf("Write content:\n");
char content[100];
fgets(content, 100, stdin);

//Selects file
printf("Select output file: ");
char file[30];
fgets(file, 30, stdin);

//Selects mode
printf("Select mode: ");
char mode[3];
fgets(mode, 3, stdin);

    FILE *fp;
    fp = fopen(file, mode);

    if (fp == 0) {
       printf("File NOT opened\n");
    }
我希望变量“file”用作文件的字符串/路径,“mode”变量也是如此。 当我运行程序时,我发现文件没有打开,这意味着fp是一个空指针

PS:这不是全部代码,但这就是破坏它的原因

提前感谢

添加此行

fprintf(stderr, "file='%s'\n", file);
在您阅读
文件
并了解到如果输入通过按Enter键终止,则将读取换行符后

摘自(我用斜体):

fgets()从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果读取换行符,则将其存储到 缓冲区。终止的空字节('\0')存储在缓冲区中最后一个字符之后


根据Chris Dodd下面的评论:这同样适用于读入
模式的字符串

添加此行

fprintf(stderr, "file='%s'\n", file);
在您阅读
文件
并了解到如果输入通过按Enter键终止,则将读取换行符后

摘自(我用斜体):

fgets()从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果读取换行符,则将其存储到 缓冲区。终止的空字节('\0')存储在缓冲区中最后一个字符之后


根据Chris Dodd下面的评论:这同样适用于读入
模式的字符串

添加此行

fprintf(stderr, "file='%s'\n", file);
在您阅读
文件
并了解到如果输入通过按Enter键终止,则将读取换行符后

摘自(我用斜体):

fgets()从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果读取换行符,则将其存储到 缓冲区。终止的空字节('\0')存储在缓冲区中最后一个字符之后


根据Chris Dodd下面的评论:这同样适用于读入
模式的字符串

添加此行

fprintf(stderr, "file='%s'\n", file);
在您阅读
文件
并了解到如果输入通过按Enter键终止,则将读取换行符后

摘自(我用斜体):

fgets()从流中最多读取一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果读取换行符,则将其存储到 缓冲区。终止的空字节('\0')存储在缓冲区中最后一个字符之后



根据Chris Dodd在下面的评论:这同样适用于读入
模式的字符串

您需要检查文件名和模式有什么问题。 首先,fgets()将新行存储到缓冲区中,这会阻止fopen()执行预期的操作。 打印出您试图打开的内容:

printf("opening: '%s' with mode '%s'\n", file, mode);
其次,您应该检查fopen设置的错误代码:

perror("File NOT Opened");

这样,您至少可以看到打开文件时出现了什么错误。

您需要检查文件名和模式有什么问题。 首先,fgets()将新行存储到缓冲区中,这会阻止fopen()执行预期的操作。 打印出您试图打开的内容:

printf("opening: '%s' with mode '%s'\n", file, mode);
其次,您应该检查fopen设置的错误代码:

perror("File NOT Opened");

这样,您至少可以看到打开文件时出现了什么错误。

您需要检查文件名和模式有什么问题。 首先,fgets()将新行存储到缓冲区中,这会阻止fopen()执行预期的操作。 打印出您试图打开的内容:

printf("opening: '%s' with mode '%s'\n", file, mode);
其次,您应该检查fopen设置的错误代码:

perror("File NOT Opened");

这样,您至少可以看到打开文件时出现了什么错误。

您需要检查文件名和模式有什么问题。 首先,fgets()将新行存储到缓冲区中,这会阻止fopen()执行预期的操作。 打印出您试图打开的内容:

printf("opening: '%s' with mode '%s'\n", file, mode);
其次,您应该检查fopen设置的错误代码:

perror("File NOT Opened");

这样,您至少可以看到打开文件时出现了什么错误。

如果文件不存在或您没有权限,那么您可能会通过非空结果收到某种类型的通知。尝试检查文件是否为空?使用w或w+模式将创建一个文件。我检查了,它仍然返回相同的错误。但无论如何,还是要感谢
fgets()
很可能会在
文件
后面的新行中读取。当我将文件初始化为char文件[30]时,您是否认为这样做。未使用的元素将保存垃圾值?(因为我可能不使用29位数字)不,短字符串后未使用的元素不是问题
fgets
写入必要的终止NUL-之后的任何内容都不会被
fopen
看到。问题是输入中的换行符。如果文件不存在或您没有权限,那么您可能会通过非空结果收到某种类型的通知。尝试检查文件是否为空?使用w或w+模式将创建一个文件。我检查了,它仍然返回相同的错误。但无论如何,还是要感谢
fgets()
很可能会在
文件
后面的新行中读取。当我将文件初始化为char文件[30]时,您是否认为这样做。未使用的元素将保存垃圾值?(因为我可能不使用29位数字)不,短字符串后未使用的元素不是问题
fgets
写入必要的终止NUL-之后的任何内容都不会被
fopen
看到。问题是输入中的换行符。如果文件不存在或您没有权限,则您将