写入 txt 文件的数据以某种奇怪的语言出现[C]
data written to txt file appears in some bizzare language[C]
所以我编写了一个程序,它将接收有关 DVD 的信息 (具体来说是 postion,IDkey(只是一些随机数)标题、类型和发行年份),并使用一个结构,它将该信息写入一个名为 "person.txt" 的 .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 文件中的输出
您正在将这些值写入文件:
int fposition;
int fIdKey;
char ftitle[50];
char fgenre[50];
int fyear;
但是您将整个文件显示为字符。这种方法适用于 ftitle
和 fgenre
,因为它们确实是字符……虽然因为您没有填充所有 50 个字符,所以也显示了一些丑陋的未初始化字符。这很容易修复:只需在写入文件之前用一些已知字符(例如 space)填充未使用的字符(以及空终止符),或者根本不写入未使用的字符。您可以使用 strlen()
来查找每个字符串的长度,并使用 memset()
将未使用的字符设置为可打印的众所周知的字符。
接下来,保存 int
并将其作为文本读取是有问题的。您需要确定一种格式。要么像现在一样以整数形式写入,而以整数形式读取(这意味着您需要一个特殊的程序来读取文件),或者您承诺只将文本写入文件。
最简单的可能是只向文件写入文本。您可以为此使用 fprintf()
,而不是 fwrite()
。您也可以将 fprintf()
用于字符数组,它会自动只写入每个字符串的“已用”部分直到空终止符,跳过所有“垃圾”字符。
所以我编写了一个程序,它将接收有关 DVD 的信息 (具体来说是 postion,IDkey(只是一些随机数)标题、类型和发行年份),并使用一个结构,它将该信息写入一个名为 "person.txt" 的 .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 文件中的输出
您正在将这些值写入文件:
int fposition;
int fIdKey;
char ftitle[50];
char fgenre[50];
int fyear;
但是您将整个文件显示为字符。这种方法适用于 ftitle
和 fgenre
,因为它们确实是字符……虽然因为您没有填充所有 50 个字符,所以也显示了一些丑陋的未初始化字符。这很容易修复:只需在写入文件之前用一些已知字符(例如 space)填充未使用的字符(以及空终止符),或者根本不写入未使用的字符。您可以使用 strlen()
来查找每个字符串的长度,并使用 memset()
将未使用的字符设置为可打印的众所周知的字符。
接下来,保存 int
并将其作为文本读取是有问题的。您需要确定一种格式。要么像现在一样以整数形式写入,而以整数形式读取(这意味着您需要一个特殊的程序来读取文件),或者您承诺只将文本写入文件。
最简单的可能是只向文件写入文本。您可以为此使用 fprintf()
,而不是 fwrite()
。您也可以将 fprintf()
用于字符数组,它会自动只写入每个字符串的“已用”部分直到空终止符,跳过所有“垃圾”字符。