我花了一些时间在网上搜索答案,但仍然没有找到任何帮助。我想读取.txt文件并将值存储在int width,int height和char message中。
更新:此外,如果read.txt中值的顺序不同,我想让程序适应。
read.txt
width 40
height 20
message "Hello"
main.c文件
FILE *file_in = fopen("read.txt", "r");
int width;
int height;
char *message = malloc(sizeof(char)*255);
fscanf(file_in, "width %d", &width);
fscanf(file_in, "height %d", &height);
fscanf(file_in, "message %s", message);
printf("width %d\n", width);
printf("height %d\n", height);
fclose(file_in);
return 0;
输出
width 0
height 0
我正在尝试获得正确的输出。我究竟做错了什么?谢谢。
答案 0 :(得分:3)
首先将字段名称读入变量。然后使用它来确定将值写入哪个变量:
char field_name[20];
while(fscanf(file_in, "%s", field_name) == 1) {
if (strcmp(field_name, "width") == 0) {
fscanf(file_in, "%d\n", &width);
} else if (strcmp(field_name, "height" == 0) {
fscanf(file_in, "%d\n", &height);
} else if (strcmp(field_name, "message") == 0) {
fscanf(file_in, "%s\n", message);
}
}
答案 1 :(得分:2)
此代码
fscanf(file_in, "width %d", &width);
fscanf(file_in, "height %d", &width);
应该是
char temBuffer[32];
fscanf(file_in, "%s %d\n", tempBuffer, &width);
fscanf(file_in, "%s %d\n", tempBuffer, &height);
BTW要写入out.txt
文件,您必须使用fprintf
fprintf(file_out, "width %d\n", width);
fprintf(file_out, "height %d\n", height);
修改强> 这是一种检查字符串值的方法e将int值赋给正确的变量。
char temBuffer[32];
int tempInt;
fscanf(file_in, "%s %d\n", tempBuffer, &tempInt);
if (strcmp(tempBuffer, "width") == 0)
{
width = tempInt;
}
else if (strcmp(tempBuffer, "height") == 0)
{
height = tempInt;
}
编辑2 非常重要且您已经过mallocated消息字符串。你必须免费拨打电话,c说话..
答案 2 :(得分:0)
您需要使用fprintf使用out文件指针将内容写入文件。输出文件中的宽度和高度值为0,因为您从未编写从输入文件中读取的值。将代码更改为如下所示 -
FILE *file_in = fopen("read.txt", "r");
FILE *file_out = fopen("out.txt", "w+");
char line[80]; // assuming 80 is max size of the line in file
int width;
int height;
char *temp1 = malloc(sizeof(char)*255);
char *temp2 = malloc(sizeof(char)*255);
while(fgets(line, 80, file_in) != NULL)
{
if (sscanf(line, "%s %s", temp1, temp2) == 2)
{
if (strcmp(temp1, "width") == 0)
{
width = atoi(temp2);
}
if (strcmp(temp1, "height") == 0)
{
height = atoi(temp2);
}
}
}
fprintf(file_out, "%s %d\n", "width", width);
fprintf(file_out, "%s %d\n", "height", height);
free(temp1);
free(temp2);
fclose(file_in);
fclose(file_out);
return 0;
答案 3 :(得分:0)
如果仔细查看我们的代码,您会读取宽度两次。 另外,您应该在fscanf格式字符串的末尾添加新行字符' \ n'您还要打印到屏幕上,如果要编写输出文件,请使用fprintf(),最后调用free()来释放使用malloc分配的内存。 您的代码应如下所示:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *file_in = fopen("read.txt", "r");
FILE *file_out = fopen("out.txt", "w+");
int width;
int height;
char *message = malloc(sizeof(char)*255);
fscanf(file_in, "width %d\n", &width);
fscanf(file_in, "height %d\n", &height);
fscanf(file_in, "message %s\n", message);
fprintf(file_out, "width %d\n", width);
fprintf(file_out, "height %d\n", height);
fclose(file_in);
fclose(file_out);
free(message);
return 0;
}
答案 4 :(得分:0)
代码失败,因为fscanf(file_in, "height %d\n", &height);
没有首先使用诉讼程序的行'\n'
而代码未检查fscanf()
的结果。
而是使用vk239作为答案的fgets()
。
如果真的想继续使用fscanf()
,请合并错误处理,在关键字之前添加前导空格以消耗先前的空格,限制字符串输入。
FILE *file_in = fopen("read.txt", "r");
if (file_in == NULL) Handle_Error();
int width;
int height;
char message[255];
if (fscanf(file_in, " width%d", &width) != 1) Handle_Error();
if (fscanf(file_in, " height%d", &height) != 1) Handle_Error();
if (fscanf(file_in, " message%254s", message != 1) Handle_Error();
printf("width %d\n", width);
printf("height %d\n", height);
fclose(file_in);
return 0;