【问题标题】:How to create .txt with username as file name in C?如何在C中使用用户名作为文件名创建.txt?
【发布时间】:2013-05-31 20:17:06
【问题描述】:

我已经成功创建了一个测验程序,它首先要求用户输入他们的姓名。

测验结束后,分数首先会打印到屏幕上,然后会打印到 username.txt 文件中。

意思是,实际用户名,如 John.txt 或 Amy.txt 或 bob.txt。

现在,我已经预定义了

report_file = fopen("username.txt","w");

这 100% 有效,但每次为不同的人运行测验并将其记录到文件中时,我自然无法正确识别文件。

我看到了关于 sprintf、snprintf、ofstream、istream 等的建议。

所有对我来说都是新概念,不知道如何前进...任何帮助将不胜感激。

如果有人想要或关心看我的程序,这很安静,我很乐意分享,但不打算在此寻求帮助期间让任何人阅读我的整个程序。 :)

【问题讨论】:

  • 你需要找到文件然后附加一些东西吗?
  • 你需要定义用户输入,获取用户名来打开文件名。
  • 您已经硬编码在一个文件名 (username.txt) 中,这显然意味着它不可能是其他任何东西。如果您有用户名,请在文件名中使用它而不是硬编码值;你自己想办法应该不会太难。

标签: c


【解决方案1】:

我希望你没有为所有用户使用"username.txt"。您如何处理用户在开始测验时输入的名称?

您的代码中可能需要类似的内容,请参阅sprintf 的文档

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

int main(int argc, char** argv)  
{ 
    FILE* pf = NULL;
    char username[250];
    char userfile[255];
    printf("username: ");
    scanf("%s", username);
    sprintf(userfile, "%s.txt", username);
    pf = fopen(userfile, "w");
    fprintf(pf, "%d", 100);
    fclose(pf);

    return 0;  
} 

您可能还想看看fopen,看看您需要哪些打开标志来满足您的要求

【讨论】:

  • 我们赢了!这是缺失的环节。非常感谢你的帮助。我需要为我的报告文件设置为 NULL 并为用户文件添加另一个字符(我将其作为 LINESIZE,定义为 200)。
  • 如果用户名大于250会怎样?
  • @J.F.Sebastian 那么你会同情必须输入 250 个字符的用户名的灵魂
  • @A4L 请问如何添加文件结尾?现在它创建文件,例如“Bob”而不是“Bob.txt”,并包含结尾。显然,目标已经实现,所以没什么大不了的。
  • @J.F.Sebastian:我呢?我的用户名是 516 字节的 NOP,然后粗略估计堆栈中间某处的地址,然后是 hello world 的 shellcode。
【解决方案2】:

如果您有他们的用户名,只需将其保存到 char 数组中,然后调用 open 并设置 O_CREAT。如果未创建文件,这将创建文件,并且由于您有他们的用户名,它将使用他们的用户名创建一个文件。

【讨论】:

    【解决方案3】:

    我看到了有关 sprintf、snprintf、ofstream、istream 等的建议。

    那么为什么不使用它们呢?

    char buffer [256];
    sprintf(buffer, "%s.txt", username);
    report_file = fopen (buffer,"w");
    

    用户名显然是一个以零结尾的字符串,其中包含用户名

    编辑:更多信息,您可以访问http://www.cplusplus.com/reference/cstdio/sprintf/

    【讨论】:

    • 如果username 大于256 会发生什么?
    【解决方案4】:

    要从用户名创建文件名,您可以使用snprintf()

    #include <stdio.h>
    #include <stdlib.h>
    /* ... */
    
    const char* filename_format = "%s.txt";
    int n = -1;
    char* filename = NULL;
    
    if ((n = snprintf(NULL, 0, filename_format, username)) < 0 ||
        (filename = malloc(n+1)) == NULL ||
        snprintf(filename, n+1, filename_format, username) != n) {
      free(filename);
      return error; 
    }
    /* use filename here... */
    free(filename); /* clean up */
    

    其中username 是一个以'\0' 结尾的C 字符串,例如,您可以使用readline() 获取它:

    #include <readline/readline.h> /* readline or editline, etc libraries */
    /* ... */
    
    char* username = NULL;
    if ((username = readline("Enter your name: ")) == NULL) return error;
    /* use username here... */
    free(username); /* clean up */
    

    编译和链接:

    $ gcc -std=c99 your_source.c -o program-name -lreadline
    

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多