写入 txt 文件的数据以某种奇怪的语言出现[C]

Posted

技术标签:

【中文标题】写入 txt 文件的数据以某种奇怪的语言出现[C]【英文标题】:data written to txt file appears in some bizzare language[C] 【发布时间】:2021-06-05 06:16:48 【问题描述】:

所以我编写了一个程序,它将接收有关 DVD 的信息 (具体来说,它是 位置IDkey(只是一些随机数)TitleGenreYear of release),并使用结构将这些信息写入名为 的 .txt 文件“person.txt”。我很肯定我的代码大部分都可以工作,但是当我去测试它时,.txt 文件中收到的输出是用一些奇怪的符号语言而不是英语编写的,坦率地说,我不知道为什么会这样。任何关于为什么会发生这种情况的解释将不胜感激,谢谢:)

计划

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

// a struct to read and write
struct dvd

    int fposition;
    int fIdKey;
    char ftitle[50];
    char fgenre[50];
    int fyear;
;

int main ()

    FILE *outfile;
    struct dvd input;

    // open file for writing
    outfile = fopen ("person.txt", "w");
    if (outfile == NULL)
    
        fprintf(stderr, "\nError opend file\n");
        exit (1);
    


    printf("Postion: ");
    scanf("%d", &input.fposition);

    printf("ID Key: ");
    scanf("%d", &input.fIdKey);

    printf("Title: ");
    scanf("%s",&input.ftitle);

    printf("Genre: ");
    scanf("%s", &input.fgenre);

    printf("Year: ");
    scanf("%d", &input.fyear);

    // write struct to file
    fwrite (&input, sizeof(struct dvd), 1, outfile);

    if(fwrite != 0)
        printf("contents to file written successfully !\n");
    else
        printf("error writing file !\n");

    // close file
    fclose (outfile);

    return 0;

试运行

.TXT 文件中的测试运行输出

【问题讨论】:

您希望输出文件中究竟是什么?您是否了解您正在将原始二进制(内存中表示)结构直接写入文件,而不是以任何方式对其进行序列化? @JonathonReinhart 好吧,我只是在尝试编写用户输入的数据(IdKey、标题等),而您对它进行专门化究竟是什么意思? 我接触 C 已经 20 多年了,但看起来你看到的垃圾只是每个字段的最后一次用户输入之后的 char 数组的内容。鉴于您没有覆盖它,它实际上包含在字符数组中,因此由 fwrite 写入。即,如果您允许 50 个字符并且用户输入“a”(不带引号),那么它应该写一个 + 49 个字符的垃圾(可能减去 1-2 个字符来解释字符串终止符 \0,但要注意这一点) . 对不起,我的意思是“序列化”(该死的自动更正)。 @ApplePie 作为一种预防措施,我将其声明为 50 个字符,因为我不完全知道用户输入的标题或类型的长度,但如果这是导致问题的原因,我'将看看它并尝试解决一些问题 【参考方案1】:

您正在将这些值写入文件:

int fposition;
int fIdKey;
char ftitle[50];
char fgenre[50];
int fyear;

但是您将整个文件显示为字符。这种方法适用于ftitlefgenre,因为它们确实是字符......尽管由于您没有填充所有 50 个字符,因此也显示了一些丑陋的未初始化字符。这很容易解决:只需在写入文件之前用一些已知字符(例如空格)填充未使用的字符(以及空终止符),或者根本不写入未使用的字符。您可以使用strlen() 查找每个字符串的长度,并使用memset() 将未使用的字符设置为可打印的知名字符。

接下来,保存int 并将其作为文本读取是有问题的。您需要决定一种格式。要么你像现在一样写成整数,然后读成整数(这意味着你需要一个特殊的程序来读取文件),或者你承诺只将文本写入文件。

最简单的可能是只将文本写入文件。您可以为此使用fprintf(),而不是fwrite()。您也可以将fprintf() 用于字符数组,它会自动将每个字符串的“已使用”部分写入空终止符,跳过所有“垃圾”字符。

【讨论】:

以上是关于写入 txt 文件的数据以某种奇怪的语言出现[C]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中,把数据储存在txt文件中的代码怎么写的?

c语言写入文件方法

用c语言创建一个txt文件,并且写入数据

C语言对文件的数据写入的方法

C语言问题stream!=NULL

c语言,数据能写入文件,但是从文件读取数据的时候,出现了乱码,如下代码,求解答