使用动态字符串的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
看到。问题是输入中的换行符。如果文件不存在或您没有权限,则您将