主頁 > 軟體工程 > 在C中,我需要一些幫助來修復我的代碼以讀取檔案中每個字符的頻率,并將其顯示在螢屏上

在C中,我需要一些幫助來修復我的代碼以讀取檔案中每個字符的頻率,并將其顯示在螢屏上

2022-04-26 10:21:37 軟體工程

所以我用 C 語言撰寫了一個代碼來列印一個名為“harrypotter1.txt”的檔案(整個第一本哈利波特書)中每個字符的頻率。當它應該只列印檔案中的字符時,它的作業原理是在它旁邊列印帶有“:0”的隨機空格。下面我將列出我的代碼,并將它列印到螢屏上的輸出顯示,如果有人可以幫助我解決問題。注意:我需要使用結構!

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    struct pair //struct to store frequency and value 
    {
        int frequency;
        char value;
    };
    
    int main()
    {
        struct pair table[128]; //set to 128 because these are the main characters
    
        int fd; // file descriptor for opening file
        char buffer[1]; // buffer for reading through files bytes
    
        fd = open("harrypotter1.txt", O_RDONLY); // open a file in read mode
        
        for(int j = 0; j < 128; j  )//for loop to initialize the array of pair (struct)
        {
            table[j].value = j; // table with index j sets the struct char value to equal the index
            table[j].frequency = 0; // then the table will initialize the frequency to be 0
        }
    
        while((read(fd, buffer, 1)) > 0) // read each character and count frequency
        {
              int k = buffer[0]; //index k is equal to buffer[0] with integer mask becasue each letter has a ASCII number.
              table[k].frequency  ; //using the struct pair table with index k to count the frequency of each character in text file
        }
    
        close(fd); // close the file
    
        for (int i = 0; i < 128; i  ) // use for loop to print frequency of characters
        {       
                printf("%c: %d\n",table[i].value, table[i].frequency); // print characters and its frequency
        }
        
        return 0; //end of code
    }

輸出:

    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
            : 3
    
    : 10702
    
    : 0
    
    : 0
    : 10702
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
    : 0
     0
    : 0
    : 0
    : 0
    : 0
     : 70803
    !: 474
    ": 4758
    #: 0
    $: 0
    %: 0
    &: 0
    ': 3141
    (: 30
    ): 33
    *: 2
     : 0
    ,: 5658
    -: 1990
    .: 6136
    /: 0
    0: 5
    1: 11
    2: 3
    3: 8
    4: 6
    5: 2
    6: 1
    7: 4
    8: 1
    9: 4
    :: 69
    ;: 135
    <: 0
    =: 0
    >: 0
    ?: 754
    @: 0
    A: 703
    B: 348
    C: 293
    D: 685
    E: 287
    F: 426
    G: 492
    H: 2996
    I: 1393
    J: 51
    K: 79
    L: 209
    M: 665
    N: 488
    O: 332
    P: 639
    Q: 203
    R: 660
    S: 844
    T: 1055
    U: 193
    V: 192
    W: 653
    X: 2
    Y: 326
    Z: 5
    [: 0
    \: 1
    ]: 0
    ^: 0
    _: 0
    `: 0
    a: 25887
    b: 4980
    c: 6403
    d: 15932
    e: 39628
    f: 6431
    g: 8127
    h: 19535
    i: 19422
    j: 319
    k: 3930
    l: 14385
    m: 6729
    n: 21337
    o: 25809
    p: 4909
    q: 217
    r: 20990
    s: 18870
    t: 27993
    u: 9562
    v: 2716
    w: 7744
    x: 381
    y: 8293
    z: 259
    {: 0
    |: 0
    }: 0
    ~: 1
    : 0

*/

uj5u.com熱心網友回復:

Allan Wind 的 C 答案很好,因為它產生了正確的結果,但它確實分配了比解決問題所需的最小值更大的字符陣列。這種空間浪費是由于 C 陣列索引必須從 0 開始并且第一個可列印字符 ' ' 的值為 32 而最后一個可列印字符 '~' 的值為 126 的事實所強制的妥協。

with Ada.Text_IO; use Ada.Text_IO;

procedure count_graphic_characters is
   subtype graphix is Character range ' ' .. '~';
   counts   : array (graphix) of Natural := (Others => 0);
   The_file : File_Type;
   C        : Character;
begin
   Open
     (File => The_file, Mode => In_File,
      Name => "src\count_graphic_characters.adb");
   while not End_Of_File (The_file) loop
      Get (File => The_file, Item => C);
      counts (C) := counts (C)   1;
   end loop;
   Close (The_file);
   for I in counts'Range loop
      Put_Line (I & ": " & counts (I)'Image);
   end loop;
end count_graphic_characters;

該程式使用 Ada 編程語言計算其自己的源檔案中字符的頻率。

子型別 graphix 被定義為包含所有從 ' ' 開始并以 '~' 結束的圖形字符。陣列名稱 counts 由子型別 graphix 中的字符索引。陣列的每個元素都是預定義子型別 Natural 的一個實體,并被初始化為 0。陣列包含的元素恰好足以計算源檔案中的每個圖形字符。

如果找不到在 Open 程序中命名的檔案,程式將引發例外。

當從檔案中讀取每個字符時,該字符將用作計數陣列的索引,并且相應的元素會遞增。

創建 128 個元素的陣列不會浪費空間。而是使用 95 個字符的陣列。也不需要檢查每個陣列元素來確定索引表示的字符是否是可列印字符,因為陣列索引值只是可列印字符。

這個程式的輸出是:

 :  132
!:  0
":  4
#:  0
$:  0
%:  0
&:  2
':  6
(:  10
):  10
*:  0
 :  1
,:  3
-:  0
.:  5
/:  0
0:  1
1:  1
2:  0
3:  0
4:  0
5:  0
6:  0
7:  0
8:  0
9:  0
::  6
;:  14
<:  0
=:  8
>:  6
?:  0
@:  0
A:  2
B:  0
C:  7
D:  0
E:  1
F:  5
G:  1
H:  0
I:  8
J:  0
K:  0
L:  1
M:  1
N:  2
O:  5
P:  1
Q:  0
R:  1
S:  0
T:  8
U:  0
V:  0
W:  0
X:  0
Y:  0
Z:  0
[:  0
\:  1
]:  0
^:  0
_:  18
`:  0
a:  26
b:  3
c:  21
d:  9
e:  43
f:  8
g:  9
h:  18
i:  22
j:  0
k:  0
l:  17
m:  3
n:  20
o:  22
p:  13
q:  0
r:  24
s:  15
t:  23
u:  13
v:  0
w:  2
x:  4
y:  3
z:  0
{:  0
|:  0
}:  0
~:  1

uj5u.com熱心網友回復:

您可以使用陣列而不是結構,因為值只是陣列索引:table[j].value = j;初始化陣列,而不是在回圈中分配初始值。添加了打開的錯誤檢查。用于isprint()確定我們是否應該列印給定的字符:

#include <ctype.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

// assumes 2^i to make the bitwise & work below
#define LEN 128

int main() {
    unsigned frequency[LEN] = { 0 };

    int fd = open("harrypotter1.txt", O_RDONLY);
    if(fd == -1) {
        printf("%s\n", strerror(errno));
        return 1;
    }
    unsigned char buffer;
    while((read(fd, &buffer, 1)) > 0) {
        frequency[buffer & (LEN-1)]  ;
    }
    close(fd);

    for (int i = 0; i < LEN; i  ) {
        if(isprint(i))
            printf("%c: %u\n", i, frequency[i]);
    }
    return 0;
}

并使用在輸入檔案中放置內容“hello world”,我得到以下輸出:

 : 1
!: 0
": 0
#: 0
$: 0
%: 0
&: 0
': 0
(: 0
): 0
*: 0
 : 0
,: 0
-: 0
.: 0
/: 0
0: 0
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 0
8: 0
9: 0
:: 0
;: 0
<: 0
=: 0
>: 0
?: 0
@: 0
A: 0
B: 0
C: 0
D: 0
E: 0
F: 0
G: 0
H: 0
I: 0
J: 0
K: 0
L: 0
M: 0
N: 0
O: 0
P: 0
Q: 0
R: 0
S: 0
T: 0
U: 0
V: 0
W: 0
X: 0
Y: 0
Z: 0
[: 0
\: 0
]: 0
^: 0
_: 0
`: 0
a: 0
b: 0
c: 0
d: 1
e: 1
f: 0
g: 0
h: 1
i: 0
j: 0
k: 0
l: 3
m: 0
n: 0
o: 2
p: 0
q: 0
r: 1
s: 0
t: 0
u: 0
v: 0
w: 1
x: 0
y: 0
z: 0
{: 0
|: 0
}: 0
~: 0

uj5u.com熱心網友回復:

前 32 個 ASCII 字符(值 0 - 31)是“不可列印的”,因為它們代表具有特殊含義或行為的字符。您可以按原樣保留代碼,但將實際列印輸出限制為僅包含“可列印”字符。您可以從空格' '(值 32)開始并在'z'(122) 結束,這將提供大部分可列印檔案(盡管不僅僅是字母)。

for (int i = ' '; i <= 'z'; i  ) // use for loop to print frequency of characters
{       
    printf("%c: %d\n",table[i].value, table[i].frequency); // print characters and its frequency
}

從您的列印輸出中可以看到 10702 CR(值 13)和 10702 LF(值 10)表明該文本檔案有 10702 個換行符并且是一個 Windows 文本檔案。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464189.html

標籤:C

上一篇:通過兩通匯編器之一

下一篇:如何將鏈表陣列存盤在二進制檔案中?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more