C - Управление файлами, невозможно получить желаемый результат - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю над своим школьным заданием и столкнулся с моим первым серьезным препятствием ... Я не могу записать в файл или даже получить данные, используя scanf и fgets.

Задача 1:

FILE *f1;
char date_trans[100][15];
    f1 = fopen("test.txt", "w");

if (f1 == NULL)
    printf("File could not be opened.\n");

else
    printf("Enter details (sender, receiver, amount.)\n");

    for(i = 0; i <= element; i++)
    {
        for(j = 0; j <= 20; j++)
            fgets(date_trans[i][j], 15, stdin);
            printf("%s", date_trans[i][j]);
    }
    fclose(f1);  

Это небольшой фрагмент кода;с вышеуказанным кодом я не могу получить введенный ввод и распечатать его на дисплее / в файл.

Мое намерение состоит в том, чтобы иметь 100 строк и до 15 символов в каждой.

Так скажи, если бы я должен был ввести дату, например 18/12/15 или 18-12-15, илиПри таком слове, как «Даниэль», программа резко останавливается на несколько секунд после того, как я нажимаю «Ввод», и затем отображается «Нажмите любую клавишу ...».

Я также получаю эту ошибку ...

[Warning] ...\assignment\test.c:22: warning: passing arg 1 of `fgets' makes pointer from integer without a cast

, который я действительно не понимаю, так как переменная date_trans является строкой / двумерным массивом символов, а не целым числом, верно?


Редактировать:

Проблема 2:

    for (j=0; j <= 50 || !feof(f1); j++); // f1 opened in 'r' mode.
        {
            fscanf(f1, "%s %d %s %d %s %f", date_trans[j], &accsend[j], accnames[j],
            &accreceive[j], accnamer[j], &amount_trans[j]);
            printf("%d %s %d %s %d %s %.2f\n", j+1, date_trans[j], accsend[j], accnames[j], 
            accreceive[j], accnamer[j], amount_trans[j]); 
        }

В приведенном выше коде я пытаюсь ввести данные через поток f1 с помощью функции fscanf, которая была открыта в режиме чтения.Однако вывод приводит к зависанию программы, и я также не могу набрать или выполнить какие-либо действия внутри программы.

Также, пожалуйста, сообщите, правильно ли я использую! Feof.

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я вижу две проблемы с кодом, который вы показываете:

  1. Предупреждение, которое вы получаете, потому что date_trans[i][j] это char, а неa char *
  2. Ваш внутренний цикл изменяется с 0 до 20 (включительно), и вы используете его в качестве индекса в массиве из 15 элементов (т.е. индексы от 0 до 14 включительно).

Для решения обеих проблем не используйте внутренний цикл, вместо этого во внешнем do

fgets(data_trans[i], sizeof data_trans[i], stdin);

Проблема номер 1 также существует в вызове printf, гдеВы передаете один char в формат, который ожидает char *.

Наконец, примечание о вашем требовании строк, содержащих 15 символов: не забывайте об ограничителе нуля и его пробелев массиве также.Это означает, что у вас есть место для 14 символов плюс терминатор.

0 голосов
/ 28 ноября 2018

Измените

    fgets(date_trans[i][j], 15, stdin);
    printf("%s", date_trans[i][j]);

на

    fgets(date_trans[i], 15, stdin);
    printf("%s", date_trans[i]);

date_trans[i][j] - это char тип не char *.Также вам не нужно j для цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...