【问题标题】:Opening a file in C using fopen使用 fopen 在 C 中打开文件
【发布时间】:2014-11-17 20:44:42
【问题描述】:

我正在尝试使用 fopen 在 C 中打开一个文件,但我遇到了一个相当奇怪的问题。如果我这样做,它会非常好:

ptr_file = fopen("file.txt", "r");

但是如果我尝试这个它不起作用

char file_name[20];    
printf("Enter file name");
scanf("%s",file_name);

ptr_file = fopen(file_name, "r");

file_name 本身的值存储在一个简单的字符数组中,如果输入相同的文件名,我真的看不出第一个和第二个实现有什么区别。我觉得我在这里遗漏了一些明显的东西。

【问题讨论】:

  • 使用 fgets 而不是 scanf 进行输入,然后删除最后一个字符 \n。使用 scanf 读取字符串很痛苦,有缓冲区溢出的风险。用 fgets 你告诉你的缓冲区有多大,在那个大小之后它会停止读取
  • “不起作用”是什么意思?您是否尝试打印出file_name 以查看其中包含的内容?
  • @JimRhodes 的意思是 -- printf("%s\n", file_name);例如,您可能在 file_name 字符串中有一个尾随 \n 字符。
  • 试试perror("fopen");
  • @jim(两者之一):最好是printf ("[%s]\n", file_name);,因此任何尾随空格或返回都是可见的。 (.. 可能不是\r,具体取决于终端类型..)。

标签: c file-io input


【解决方案1】:

无论是否有尾随\n,都会作为空格跳过。这是一个简单的例子:

#include <stdio.h>

int main() {

    char file_name[20];

    printf ("\nEnter a filename: ");
    scanf("%[^\n]%*c", file_name);

    FILE *ptr_file = fopen(file_name, "r");

    if (!ptr_file)
        fprintf (stderr, "\nError: failed to open '%s'\n\n", file_name);
    else
        printf ("\n  Successfully opened file: '%s'\n\n", file_name);

    /* do stuff with file */

    if (ptr_file) fclose (ptr_file);

    return 0;
}

输出:

$ ./bin/fileopen

Enter a filename: tolowercnvsn.c

  Successfully opened file: 'tolowercnvsn.c'

它同样适用于:

scanf("%s", file_name);

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多