Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

C++讀取txt到陣列,並運算的問題

我的txt檔有4行數據,聽說是要設定二維陣列

1 6 3.00 90000.00

1 7 3.00 90000.00

2 8 1.80 90000.00

2 9 1.80 90000.00

3 10 2.00 90000.00

3 11 2.00 90000.00

4 12 1.20 90000.00

4 13 1.20 90000.00

5 41 2.00 90000.00

.

.

.

讀入後我只需要用到第一行的數據

並判斷個別數字,出現的總次數

最後的輸出結果必須跑出這樣的形式

A[1]=2 (1共出現2次)

A[2]=2 (2共出現2次)

A[3]=2 (3共出現2次)

A[4]=2 (4共出現2次)

A[5]=1 (5共出現1次)

.

.

我使用的是Visual C++6,還請高手幫忙拉^^

Update:

J兄,你的程式碼我複製過來不能用ㄝ,會出錯,能請您再幫我看看嗎?

我貼一下我同學寫的(但是像A[3]=0會無法顯示)

#include

#include

#include

#include

using namespace std;

void main()

{

int i=1,j=1,k,h=1;

double link[457][4]={0};

int a[457][2]={0};

ifstream file("big-link.txt",ios::in);

Update 2:

if(!file)

{

cout << "檔案無法開啟"<

> link[i][j] ;

}

}

file.close();

Update 3:

a[h][1]=link[1][1];

a[h][2]++;

for(k=2;k<=457;k++)//

{

if(link[k][1]==a[h][1])

{

a[h][2]++;

a[h][1]=link[k][1];

}

else

{

cout << "A[" << a[h][1] << "] = "<< a[h][2] << endl;

h++;

a[h][1] = link[k][1];

a[h][2]++;

}

Update 4:

檔名的地方我知道,我也在你說的地方加上

else

printf("File not found\n");

是沒有error但是執行時會跑出紅色警告,中止 重試

跟我用Viaual C++6有關西嗎?

Update 5:

就是我點下紅色驚嘆號執行後~她跑出

Debug Error!

C:\Debug\0930.exe

runtime error

中止 重試 略過

所以沒有結果跑出來,3個鍵我都試過了...

Update 6:

http://tw.knowledge.yahoo.com/question/question?qi...

這位網友也是發生跟我一樣的問題...

3 Answers

Rating
  • 1 decade ago
    Favorite Answer

    1. 你 2~4 欄的資料都再也不要了?

    2. 你還要原始的第一欄嗎?

    3. 列數是否未知? 可有上限? (做法不同)

    (4. 第一欄有啥特性,如:不遞減?,和上一列相等或+1,...)

    2008-09-29 19:01:07 補充:

    下列程式只是針對您目前的需要而設計。

    它並非良好的設計,因為細節需求不詳。

    使用 short 因

     一個 col0 的數值出現 32767次可能性太低;

     用 int 太浪費

    用 fgets + sscanf 解決 buffer underrun問題,而不必去用 fscanf_s。

    fscanf_s 當 buffer underrun 時的處理方式,不適用於多數程式!

    #include <memory.h>

    #include <stdio.h>

    #include <stdlib.h>

    #define SIZE 1048576

    #define SIZE_LINE 1024

    short A[SIZE];

    int main(void)

    { double col2, col3;

    int col0, col1, n;

    FILE *fp;

    char buf[SIZE_LINE];

    memset(A, 0, SIZE*sizeof(*A)); // clear

    if ((fp = fopen("Col1.TXT", "r")) != NULL)

    { while (fgets(buf, SIZE_LINE, fp) != NULL)//use fgets + sscanf for savety

    { n = sscanf(buf, "%d %d %lf %lf", &col0, &col1, &col2, &col3);

    if (n != 4)

    break; // error

    if (col0 < SIZE && col0 > 0)

    A[col0]++;

    else

    printf("Index excceed capacity!!\a\n");

    };

    }

    for (n=0; n<SIZE; n++)

    if (A[n])

    printf("[%5d] %hd\n", n, A[n]);

    system("PAUSE");

    return fclose(fp);

    }

    2008-09-29 19:02:34 補充:

    以你目前的需求,一維就搞定。

    未來要讀 col 1 ~ 3,建議用struct 或 四個一維

    此題個人認為,不該用二維

    2008-09-29 19:03:38 補充:

    程式沒仔細測試(有大略測試),

    你要自行測試一下!

    2008-09-30 04:53:06 補充:

    不能用的定義是什麼?

     compiler 不過?

     執行時出錯?

     出來的答案是什麼?

    怎麼個錯法?

    你總要給我個方向。

    2008-09-30 04:55:44 補充:

    如果只是沒反應,那是檔名不同,你改一下檔名(fopen("...", "r");)。

    要是開檔沒成功要有錯誤訊號,在很後面

     for (n=0; ...

    前加上

    else

    printf("File not found\n");

    就可以了

    2008-09-30 04:57:45 補充:

    你同的學程式被知識+吃掉太多,沒辦法看!

    2008-09-30 05:00:41 補充:

    我說過,我測過:就是說:它可以 compile,可以 run,答案是對的。

    我 post 出來的程式多少都做過 stress test,

    至少會做基本的 test。

    沒做過 stress test的,才會說:沒好好測。

    我沒裝 VC6,我用的是 VSC 2005

    最多只是版本差異的問題。

    你總要給我錯誤訊號。

    2008-10-01 07:32:25 補充:

    x 的功力也不弱,有可能是相容性問題。

    那程式我再跑過,沒錯!

    我請有用 VC6 的高手跑跑看。

    你 compile 時,沒有錯誤/警告嗎?

    2008-10-01 07:34:48 補充:

    你把

    #define SIZE 1048576

    的 1048576 改小試試,如:3000

    2008-10-01 09:10:56 補充:

    我請高手用 VC6 試的結果,是 VC6 的 Bug!

    你在 memset 前加一列

    col2 = col3 = 0.;

    就可以了。

    這題double 不用初值,

    VC6 在我沒用 double 下,沒 link floating 的 lib,造成的問題

    所以,就〝用〞它一下吧。

    2008-10-01 20:08:05 補充:

    所以我回答時最開始才加上那兩句啊!

    要是要寫成 general,...

    是可以不用寫得很複雜啦!

    不過,不太想。

  • ?
    Lv 5
    1 decade ago

    第一欄的數值最大會有多大阿 ...

    太大用Jocob 寫的方法可是沒辦法處理的.

  • 1 decade ago

    1.目前的作業暫時只會用到第一欄,2~4後續的延伸才會使用到

    2.是可以不要,結果要能跑出A[1]=2就行了

    假使txt第一行中1有出現5次,那結果就是A[1]=5

    假使txt第一行中3有出現8次,那結果就是A[3]=8

    3.筆數不一定,到時老師會給txt檔測試,這個程式需要跑出正確的結果

    4.第一欄雖然看似遞增,但老師說不一定,所以還是要都去判斷

    11223344566678888.....(第一行)

    有勞幫忙了,感謝!!

Still have questions? Get your answers by asking now.