Чтение файла - Вопрос о назначении курса C - PullRequest
2 голосов
/ 03 июля 2011

Я беру вводный курс по программированию на Си и имею это задание.

Напишите программу, которая читает в виде входного файла обычный текстовый файл и выводит, сколько каждой буквы появилось в этом файле.

Ниже приведено то, что я имею до сих пор.Проблема в том, что он ничего не выводит, и я понятия не имею, что делать.Я понимаю, что в цикле while нет правильного выражения.Я поместил туда заполнитель, "TEST", потому что я не уверен, что нужно проверить, чтобы увидеть, когда он достигнет конца файла.Есть идеи?

#include <stdio.h>

int main()  {
    int i, index, chars[256];
    char letter;
    FILE *ifp;

    //sets the value of all the counters to 0
    for (i = 0; i < 256; i++)
        chars[i] = 0;

    ifp = fopen("input.txt", "r");

    //loops through reading each character and then increments the counter by 1
    while (TEST)    {
        fscanf(ifp, "%c", &letter);
        index = letter;
        chars[index] += 1;
    }

    //prints the totals for each character
    for (i = 0; i < 256; i++) {
        letter = i;
        printf("%c: %d\n", letter, chars[i]);
    }

    fclose(ifp);

    return 0;
}

Ответы [ 6 ]

5 голосов
/ 03 июля 2011

Немного сбился с пути.Это создаст if джунгли по сравнению с очень лаконичным кодом, которого можно достичь.

В этом посте предполагается, что вы работаете с кодировкой ASCII, что должно быть верно, если вы не работаете с очень странной системой.

У меня есть две или три подсказки для вас.Во-первых, массивы являются отличными инструментами для группировки значений.

Во-вторых, символы на самом деле являются целыми числами, вы можете вычесть буквы из букв.

char letter = 'z';
int index = letter - 'a'; // gives 25

Вас также может заинтересовать isalpha функция.

2 голосов
/ 03 июля 2011

Главный намек на то, что каждый символ на самом деле является просто числом (см. ASCII ). Пример: A = 65 и B = 66. Наличие переменной для каждой буквы не очень хорошая идея.

1 голос
/ 03 июля 2011

Если учесть тот факт, что в алфавите (я предполагаю, что на английском) есть 26 символов, это будет означать огромное количество if утверждений, все из которых будут очень похожи друг на друга.Если вы повторяете очень похожий код много раз, это признак того, что вы делаете что-то не так.

Я предполагаю, что вы уже изучили несколько базовых структур данных.Задумывались ли вы о хранении счетчика для каждой буквы в одной из этих структур?Помните, что каждый символ на самом деле является только цифрой для компьютера.

Кроме того, помните, что текст - это больше, чем просто буквы алфавита.Вероятно, вы можете получить более высокую оценку за то, что обрабатываете пробелы и другие символы в некоторой разумной форме (другими словами: делайте что-либо кроме игнорирования проблемы).

0 голосов
/ 03 июля 2011

Простое исправление для вашей программы: объявите переменную int ch; (ПРИМЕЧАНИЕ: она ДОЛЖНА быть int!) И переписайте ваш цикл while следующим образом:

while ((ch = fgetc(ifp)) != EOF)
{
  assert(ch >= 0 && ch < 256);
  ++chars[ch];
}

На всякий случай есть assertВы запускаете программу на какой-то странной платформе, где символы находятся вне диапазона 0-255.(О да, вам также нужно включить <assert.h>)

0 голосов
/ 03 июля 2011

Вот несколько советов, которые могут помочь,

  • Вы не проверяете, успешно ли открыт файл .Допустим, файл не выходит.Как будет выполняться программа?Это одна из причин, по которой он может ничего не отображать.
  • Вы также можете сделать все элементы массива равными этому значению,

int arr [500] = {0}; // вам это сейчас не нужно.

  • Использовать массив типа . Вставить в него все из файла.
  • Как уже упоминалось, используйте isalpha (), чтобы проверить, является ли он алфавитом, кроме того, используйте isupper() и islower(), чтобы проверить как прописные, так и строчные буквы.
0 голосов
/ 03 июля 2011

Я предлагаю читать блок за блоком или строку за строкой вместо символа за символом. Вы можете создать статический массив int, который имеет 256 ячеек и увеличивать соответствующий индекс в соответствии с символом. Вот некоторый полупсевдокод:

int chars[256];
char *buffer;

while(len = read_chars_to_buffer(buffer)) {
    for(i = 0; i < len; i++) {
        chars[buffer[i]]++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...