2015-12-18 92 views
1

我花了一些时间在互联网上寻找答案,但仍然没有找到任何帮助。我想读取一个.txt文件并将值存储在int width,int height和char消息中。阅读C中文件的一部分

更新:此外,我想使程序适应情况下,如果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 

我试图得到正确的输出。我究竟做错了什么?谢谢。

+3

这是C还是C++?请选择一个。 – SirDarius

+5

似乎您需要使用'fprinf'而不是'printf'来将输出写入文件... –

+5

请注意,您已读入宽度两次。 – errikos

回答

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); 
    } 
} 
+0

这会失败,原因有两个。 1)任何空白区域,如换行符或空格,都会导致读取'field_name'失败。 2)由于同样的原因,“消息”的读取将失败。建议在这两个格式字符串中的每一个的开头插入一个空格另外,总是限制%s输入的长度,所以输入缓冲区不能溢出。 I.E. 'fscanf(file_in,“%19s”,field_name)''和'fscanf(file_in,“%254s \ n”,message)'' – user3629249

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); 

编辑 这是检查方式字符串va将e值赋给正确的变量。

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; 
} 

EDIT 2 非常importand:你mallocated消息字符串。您必须拨打免费电话,对话..

+0

好的,'fprintf()'为输出;-) – Christophe

+0

@Christophe是的,我一步一步地编辑;) – LPs

+0

谢谢,那是行得通的。但是,如果第一个值是宽度,程序如何知道?我如何检查第一个值是宽度而不是高度? – michithebest

0

您将需要使用您的输出文件指针使用fprintf将内容写入文件。输出文件中的宽度和高度值为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; 
+1

这是最好的方法,强烈建议只使用fgets()'输入和沟'fprintf()'。 – chux

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; 
} 
+1

在格式中添加''\ n''是一个合理的想法,它可以像''\ n''等消耗_any_空格,并修复OP的一个问题。不清楚为什么有人下了这个票。 – chux

0

代码失败,因为fscanf(file_in, "height %d\n", &height);没有首先消耗程序的路线'\n'和代码没有检查的fscanf()结果。

取而代之的是使用fgets(),由vk239回答。

如果真的想要与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;