用C读取文件的一部分

时间:2015-12-18 21:05:48

标签: c

我花了一些时间在网上搜索答案,但仍然没有找到任何帮助。我想读取.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

我正在尝试获得正确的输出。我究竟做错了什么?谢谢。

5 个答案:

答案 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消息字符串。你必须免费拨打电话,说话..

答案 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;