2015-12-18 130 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;