2015-10-26 5 views
-2

ПОЖАЛУЙСТА, СМОТРЕТЬ В РЕДАКТИРОВАНИИ В КОНЕЦ ДАННОГО ТЕКСТА У меня есть test.dat, который имеет 2 строки. В первой строке находится число с плавающей точкой (5.0) Во второй строке представлены два целых числа, разделенных символом «*», например, 4 * 3 Номер плавающего номера отображается правильно (выход: 5,0000), но второй строка не отображается. Мой учитель сказал, что я совершил ошибку после цикла while. Fscanf читает END файла, а не начало. Вот почему я получаю случайные числа в виде вывода, например «65746 * -8634364». Я не знаю, как его решить. Ваша помощь будет приятной. Вот мой C код:Программа C читает конец файла

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    float z1; 
    int z2,z3; 
    char line[255]; 

    FILE *file; 
    file = fopen("test.dat", "r"); 
    if (file==NULL) 
    { 
     printf("Error\n"); 
     return 1; 
    } 

    fscanf(file, "%f", &z1); 
    printf("%f\n", z1); 

    while (fscanf(file, "%s", line) == 1) 
    { 
     fscanf(file, "%d*%d", &z2, &z3); 
     printf("%d * %d\n", z2,z3); 
    } 
    fclose(file); 
    return 0; 
} 

EDIT: Я получил новое предупреждение после того, как я следовал указаниям первого ответа Предупреждение Код: In function ‘main’: main.c:21:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[255]’ [-Wformat=] while (fscanf(file, "%s", &line) ==1) ^

EDIT 2: предупреждение исчезает, благодаря первый ответ !! Еще проблема: содержимое второй строки - «4 * 3», мой вывод «0 * 0». Почему?

+0

Пожалуйста, добавьте содержимое файла _test.dat_ на свой вопрос. –

+0

Тест. dat - это только текстовый файл, который выглядит следующим образом: 1-я строка: 5.0 2-я строка: 4 * 3 Вот и все. – Blnpwr

+0

(Пожалуйста, не слишком сильно меняйте свой вопрос, так как это может привести к аннулированию существующих ответов. Также нет необходимости добавлять «Разрешенный» в любом месте вашего вопроса. Наличие принятого ответа является достаточным показателем этого.) – usr2564301

ответ

4
while (fscanf(file, "%s", &line) != EOF) 
        ^wrong argument is passed to %s 

Вы читаете строку в line, но line объявлен как char переменной -

char line;     // will invoke UB if no space is left for '\0' 

Таким образом, вы должны объявить line в качестве char массива. Некоторые вещи, как это -

char line[255];   //make sure to leave a space for null character 

Примечание -Наверное не испытывают fscanf против EOF, написать условие цикла следующим образом -

while (fscanf(file, "%s", line)==1)  //will return 1 only if it is successful 
      /*   ^note- don't pass here &line, just pass line */ 
+0

Спасибо, много. – Blnpwr

+0

@Blnpwr Добро пожаловать :-) – ameyCU

+0

Я могу принять ваш ответ за 4 минуты, так что не удивляйтесь, пожалуйста: D Собирайтесь сделать это как можно скорее. – Blnpwr

1

Вы заполняете переменную обугленного с fscanf. Вы должны использовать char *, так как вы используете% s в своей строке формата.

+0

Он выдает эту ошибку после исправления первого ответа: В функции «main»: main.c: 21: 2: warning: format '% s' ожидает аргумент типа char * ', но аргумент 3 имеет тип' char (*) [255] '[-Wformat =] while (fscanf (файл «% s», & line) == 1) ^ – Blnpwr

Смежные вопросы