| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2941 人关注过本帖
标题:读取和处理文件中的数组问题
只看楼主 加入收藏
tianyi1993
Rank: 1
等 级:新手上路
帖 子:23
专家分:9
注 册:2012-1-24
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:12 
读取和处理文件中的数组问题
程序的功能是读取文件里的数据,统计正数,负数和零的个数
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
int main()
{
    int m=0,n=0,p=0,i=0;
    int k[15];
    FILE *fp;
    if((fp=fopen("zhengshu.dat","rb"))==NULL)
    {
        printf("cant open this file");
        exit(0);
    }
    fscanf(fp,"%d\t",k); //读取文件到数组
    for(i=0;i<7;i++)
    {
        if(k[2*i-1]>0)
            m++;
        else if(k[2*i-1]<0)
            n++;
        else if(k[2*i-1]==0)
            p++;
    }
    printf("there is %d zheng and %d fu and %d 0\n",m,n,p);
    fclose(fp);
    return 0;
}我在文件里写的全是正数(12    13    14    15    16)结果却显示为一个正数和六个负数,感觉应该是文件读取的的问题,但是怎么也找不出来,请各位大侠帮忙看下

搜索更多相关主题的帖子: 数据 统计 include file 
2012-03-24 13:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
请重温scanf()函数的用法

授人以渔,不授人以鱼。
2012-03-24 14:13
google天下
Rank: 2
等 级:论坛游民
帖 子:18
专家分:38
注 册:2012-3-14
收藏
得分:0 
回复 楼主 tianyi1993
k[2*i-1] 为什么要2*i-1呢,说说为什么?

[ 本帖最后由 google天下 于 2012-3-24 17:53 编辑 ]
2012-03-24 17:06
google天下
Rank: 2
等 级:论坛游民
帖 子:18
专家分:38
注 册:2012-3-14
收藏
得分:5 
fscanf(fp,"%d",k); //读取文件到数组 这一行有问题。
不能直接写进k数组中
应该:
程序代码:
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int m=0,n=0,p=0,i=0;
    int k[15];
    FILE *fp;
    
    if((fp=fopen("zhengshu.txt","r"))==NULL)
    {
        printf("cant open this file");
        exit(0);
    }
    
    for(i=0;i<7;i++)
    {
        fscanf(fp,"%d,",&k[i]); //读取文件到数组
        printf("%d ",k[i]); 
        if(k[i]>0)
            m++;
        else if(k[i]<0)
            n++;
        else if(k[i]==0)
            p++;
    }
    printf("there is %d zheng and %d fu and %d 0\n",m,n,p);
    fclose(fp);
    return 0;
}
2012-03-24 18:11
tianyi1993
Rank: 1
等 级:新手上路
帖 子:23
专家分:9
注 册:2012-1-24
收藏
得分:0 
回复 2楼 TonyDeng
因为我认为奇数位是制表符转换成的int数字,不是输入的数字
2012-03-24 22:25
tianyi1993
Rank: 1
等 级:新手上路
帖 子:23
专家分:9
注 册:2012-1-24
收藏
得分:0 
回复 3楼 google天下
嗯,不过怎么改了之后结果还是原来的样子啊
2012-03-24 22:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你确定照4楼那样改了之后还是不行?1楼那个文件内容是从你那里复制过来的吗?把那文件传上来看看。

授人以渔,不授人以鱼。
2012-03-24 22:58
tianyi1993
Rank: 1
等 级:新手上路
帖 子:23
专家分:9
注 册:2012-1-24
收藏
得分:0 
回复 6楼 tianyi1993
zhengshu.rar (416 Bytes)
大侠,这是我写的文件
2012-03-25 11:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
注意描红部分的读法:


 
#include <Windows.h>
#include "myConsole.h"
 
void ShowStatusBar(void);
 
const SHORT MaxRows = 25;
const SHORT MaxCols = 80;
myConsole Console(GetStdHandle(STD_OUTPUT_HANDLE));
 
int wmain(int argc, wchar_t argv[])
{
    Console.SetTitle(L"整数读取并统计");
    Console.Cls(FOREGROUND_WHITE | BACKGROUND_BLUE);
    ShowStatusBar();
 
    const char file_name[] = "e:\\Projects\\test\\test\\zhengshu.dat";
    FILE* file;
    errno_t error = fopen_s(&file, file_name, "rt");
    if (error == 0)
    {
        COORD pos = { 0, 0 };
        Console.MoveCursor(pos).WriteText(L"文件中的数据:");
        int data;
        while (!feof(file) && (fscanf_s(file, "%d", &data) > 0))
        {
            ++pos.Y;
            WCHAR buffer[80];
            swprintf_s(buffer, L"%d", data);
            Console.MoveCursor(pos).WriteText(buffer);
        }
        fclose(file);
    }
    else
    {
        WCHAR msg[1024];
        swprintf_s(msg, L"文件%s打开错误,错误码:%d", file_name, error);
        Console.MoveCursor(0, 0).WriteText(msg);
    }
 
    while (Console.ReadKey() != myConsole::K_ESC)
    {
        ;
    }
 
    return EXIT_SUCCESS;
}
 
void ShowStatusBar(void)
{
    WORD attr(Console.GetTextAttribute());
    SMALL_RECT rect = { 0, MaxRows - 1, MaxCols - 1, MaxRows - 1 };
    Console.SetTextAttribute(FOREGROUND_YELLOW | BACKGROUND_RED);
    Console.Clear(rect);
    Console.MoveCursor(rect.Left, rect.Top).WriteText(L"按<Esc>键结束程序");
    Console.SetTextAttribute(attr);
}


[ 本帖最后由 TonyDeng 于 2012-3-25 14:10 编辑 ]

授人以渔,不授人以鱼。
2012-03-25 14:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
下面补上你要的统计:

程序代码:
#include <Windows.h>
#include "myConsole.h"

void ShowStatusBar(void);

const SHORT MaxRows = 25;
const SHORT MaxCols = 80;
myConsole Console(GetStdHandle(STD_OUTPUT_HANDLE));

int wmain(int argc, wchar_t argv[])
{
    Console.SetTitle(L"整数读取并统计");
    Console.Cls(FOREGROUND_WHITE | BACKGROUND_BLUE);
    ShowStatusBar();

    const char file_name[] = "e:\\Projects\\test\\test\\zhengshu.dat";
    FILE* file;
    errno_t error = fopen_s(&file, file_name, "rt");
    if (error == 0)
    {
        int count_array[3] = { 0 };
        COORD pos = { 0, 0 };
        Console.MoveCursor(pos).WriteText(L"文件中的数据:");
        int data;
        while (!feof(file) && (fscanf_s(file, "%d", &data) > 0))
        {
            ++pos.Y;
            if (data > 0)
            {
                pos.X = 0;
                ++count_array[0];
            }
            if (data == 0)
            {
                pos.X = 10;
                ++count_array[1];
            }
            if (data < 0)
            {
                pos.X = 20;
                ++count_array[2];
            }
            WCHAR buffer[80];
            swprintf_s(buffer, L"%d", data);
            Console.MoveCursor(pos).WriteText(buffer);
        }
        fclose(file);
        WCHAR buffer[1024];
        pos.X = 0;
        pos.Y += 2;
        swprintf_s(buffer, L"正数%d   零%d   负数%d", count_array[0], count_array[1], count_array[2]);
        Console.MoveCursor(pos).SetTextAttribute(FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE).WriteText(buffer);
    }
    else
    {
        WCHAR msg[1024];
        swprintf_s(msg, L"文件%s打开错误,错误码:%d", file_name, error);
        Console.MoveCursor(0, 0).WriteText(msg);
    }

    while (Console.ReadKey() != myConsole::K_ESC)
    {
        ;
    }

    return EXIT_SUCCESS;
}

void ShowStatusBar(void)
{
    WORD attr(Console.GetTextAttribute());
    SMALL_RECT rect = { 0, MaxRows - 1, MaxCols - 1, MaxRows - 1 };
    Console.SetTextAttribute(FOREGROUND_YELLOW | BACKGROUND_RED);
    Console.Clear(rect);
    Console.MoveCursor(rect.Left, rect.Top).WriteText(L"按<Esc>键结束程序");
    Console.SetTextAttribute(attr);
}



[ 本帖最后由 TonyDeng 于 2012-3-25 21:44 编辑 ]

授人以渔,不授人以鱼。
2012-03-25 14:58
快速回复:读取和处理文件中的数组问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018924 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved