读不到文件里的数据啊!各位大哥帮忙看看哪里错了。谢谢!

nemichy 2008-04-13 04:04:05
/*这是一道读取文件(只是存储整形数的文件)内数据的C++程序,不知为什么运行的时候,读出的数据不对啊!

各位大哥帮忙看看哪里错了。谢谢!
*/

#include"Test Read_WriteFile.h"

char* GetFileNameByInput(char Buffer[])
{
printf("Please input a shape file's name with directtory:\n");
while(gets(Buffer)==NULL)
printf("Sorry you input nothing!Please try again\n");
return Buffer;
}

int main(int argc,char** argv)

{
char* InputFileName;
char FileNameBuffer[256];
FILE* fp;

if(argc<2)
InputFileName=GetFileNameByInput(FileNameBuffer);

else
InputFileName=argv[1];

if((fp=fopen(InputFileName,"rb"))==NULL)
{
printf("Can't open file!Please check FileDirectory or FileName\n");
return 0;
}

unsigned int FileCode;//从fp文件中读出一个unsign int的数据,所临时存储的内存地址

while(!feof(fp))//文件未读完
{
fread(&FileCode,sizeof(unsigned int),1,fp);
printf("%u\t",FileCode);
)

free(&FileCode);
feof(fp);
return 1;
}
...全文
163 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuyunliuhen 2008-04-15
  • 打赏
  • 举报
回复
9
唐巧 2008-04-15
  • 打赏
  • 举报
回复
free(&FileCode); 不对,因为FileCode不是一个指向堆的内存空间的指针.
星羽 2008-04-15
  • 打赏
  • 举报
回复


#include "stdlib.h"

char* GetFileNameByInput(char Buffer[])
{
printf("Please input a shape file's name with directtory:\n");
while(gets(Buffer)==NULL)
printf("Sorry you input nothing!Please try again\n");
return Buffer;
}

int main(int argc,char** argv)
{
char* InputFileName;
char FileNameBuffer[256];
FILE* fp;

if (argc < 2)
InputFileName = GetFileNameByInput(FileNameBuffer);

else
InputFileName = argv[1];

if ((fp=fopen(InputFileName,"r"))==NULL)
{
printf("Can't open file!Please check FileDirectory or FileName\n");
return 0;
}

unsigned int FileCode;//从fp文件中读出一个unsign int的数据,所临时存储的内存地址

while(1)//文件未读完
{
fscanf(fp, "%u,", &FileCode);
printf("%u\t",FileCode);
if (feof(fp))
break;
}

fclose(fp);
return 1;
}

----------

测试,text.txt

文件内容

0,1,2,3,4,5


输出

Please input a shape file's name with directtory:
test.txt
0 1 2 3 4 5 5


薛勇 2008-04-15
  • 打赏
  • 举报
回复
free(&FileCode);错了,仔细看看
rushman 2008-04-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nemichy 的回复:]
哦。。。哪里free(&FileCode)是错了。谢谢!
这道程序是编译过了的,就是在运行的时候得不到正确的数据。
我读取的.txt数据只是简单的0、1数啊,数据间用空格隔开的,这不会有问题吧。
[/Quote]
如果文件格式如你所说的是“....txt数据只是简单的0、1”“数据间用空格隔开”的话,大概问题就在这里了。
在计算机中,所有的信息(数据)就是用字节/字表示的,字符串是如此,各种数值也是如此,同样的一串字节,不同的解释会产生不同的结果。字符“1”可以解释为整数0x31,整数0x20可以解释为空格。
fread 读取的是字节,也就是说直接从文件中读取若干个字节的数据并填充到某个内存区域。在你的程序中,是从文件中是读取一个 int,在32位系统下是4字节,并把它存到变量 FileCode 中。
假设文件的内容是这样的一串ASCII字符“1 0 0 1”,那么第一次读取的 FileCode 应该是 0x20302031,这是“1 0 ”这四个字符(4字节)的ASCII码组合成的4字节整数。

事件上,错误仅仅是输入文件的格式和程序对文件数据的解释不匹配造成输出不是希望的值。
解决的办法有两种,一种办法是把输入文件改为二进制整数序列,另一种办法是把 fread 改为 fscanf(fp,"%d ",&FileCode),同时需要把 fopen 的模式由“rb”改为“r”。

总结一下:
1.如果读取的是文本格式的文件,那么得到的是一个字符串,fread 不会帮您把字符串转换为整数;
2.如果需要读取一串字符并转换为数值等其他数据,则需要用 scanf/fscanf 等函数来读取格式化的字符串并进行转换;
3.用 fread 读取的是一串字节,而字节(或若干字节)根据不同的解释会有不同的含义;
4.仅对于二进制文件,才采用"b"模式打开。

顺便提一下,我前面说“过不去编译”是就你贴出的代码说的,没什么其他的意思。
hslinux 2008-04-15
  • 打赏
  • 举报
回复
up
nemichy 2008-04-15
  • 打赏
  • 举报
回复
谢谢,rushman的总结。
rushman 2008-04-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 nemichy 的回复:]
感谢各位!特别是chiyer,你的程序是有正确的结果,但是少了#include "stdio.h"。
请问为什么我用fread()是读不到正确的数据了?
[/Quote]
7楼
nemichy 2008-04-15
  • 打赏
  • 举报
回复
感谢各位!特别是chiyer,你的程序是有正确的结果,但是少了#include "stdio.h"。
请问为什么我用fread()是读不到正确的数据了?
nemichy 2008-04-14
  • 打赏
  • 举报
回复
哦。。。哪里free(&FileCode)是错了。谢谢!
这道程序是编译过了的,就是在运行的时候得不到正确的数据。
我读取的.txt数据只是简单的0、1数啊,数据间用空格隔开的,这不会有问题吧。

bob_2008 2008-04-13
  • 打赏
  • 举报
回复
强人,指针没有初始化!!
rushman 2008-04-13
  • 打赏
  • 举报
回复
LZ,你自己没测试吧!
/*这是一道读取文件(只是存储整形数的文件)内数据的C++程序,不知为什么运行的时候,读出的数据不对啊!

各位大哥帮忙看看哪里错了。谢谢!
*/

#include"Test Read_WriteFile.h"

char* GetFileNameByInput(char Buffer[])
{
printf("Please input a shape file's name with directtory:\n");
while(gets(Buffer)==NULL)
printf("Sorry you input nothing!Please try again\n");
return Buffer;
}

int main(int argc,char** argv)
{
char* InputFileName;
char FileNameBuffer[256];
FILE* fp;

if(argc <2)
InputFileName=GetFileNameByInput(FileNameBuffer);
else
InputFileName=argv[1];

if((fp=fopen(InputFileName,"rb"))==NULL)
{
printf("Can't open file!Please check FileDirectory or FileName\n");
return 0;
}

unsigned int FileCode;//从fp文件中读出一个unsign int的数据,所临时存储的内存地址

while(!feof(fp))//文件未读完
{
fread(&FileCode,sizeof(unsigned int),1,fp);
printf("%u\t",FileCode);
// ) // 貌似是个圆括号,应该过不去编译
}

// free(&FileCode); // 不是动态分配的,干吗要 free,这样要出问题的
// feof(fp); // 这是干吗?
fclose(fp); // 你是想这样吧
return 1;
}
野男孩 2008-04-13
  • 打赏
  • 举报
回复
光看你这代码没问题,除非文件的数据组织不是4个字节,4个字节的整数~
所以建议确认一下文件里面的数据是如何组织的。
c_spark 2008-04-13
  • 打赏
  • 举报
回复
读文件时不存在整数,在文本文件中只有字符..
可以通过读字符来输出想要的值
还有你根本就不用自己使用函数来处理参数
main函数本身就带了
在命令提示符下输入:
test file.in
agrv[1]就是你要打开的文件名file.in
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char* argv[])
{
FILE* fp;
if((fp=fopen(argv[1],"rb"))==NULL)
{
printf("Can't open file!Please check FileDirectory or FileName\n");
return 0;
}

//unsigned int FileCode;//从fp文件中读出一个unsign int的数据,所临时存储的内存地址
char buf;
while(!feof(fp))//文件未读完
{
//fread(&FileCode,sizeof(unsigned int),1,fp);
fread(&buf,sizeof(char),1,fp);
printf("%c",buf);
}
feof(fp);
return 1;
}
Inhibitory 2008-04-13
  • 打赏
  • 举报
回复
fread(&FileCode,sizeof(unsigned int),1,fp);
没有这样读unsigned int数据的,

你可以使用fscanf来从文件读取这种类型的数据.
相关推荐

Re: 《Galera 高可用 MySQL 集群》 (Percona Xtradb Cluster)PXC v5.7 + Haproxy + Keepalived

========================================================

# Galera Cluster 如何解决问题

我们知道 Galera Cluster 是 MySQL封装了具有高一致性,支持多点写入的同步通信模块Galera而做的,它是建立在MySQL同步基础之上的,使用 Galera Cluster时,应用程序可以直接、写某个节点的最新数据,并且可以在不影响应用程序写的情况下,下线某个节点,因为支持多点写入,使得 Failover 变得非常简单。

目前Galera Cluster具备的功能包括如下几个方面:

    1) 多主架构:真正的多点写的集群,在任何时候数据,都是最新的。

    2) 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失。

    3) 并发复制:从节点在APPLY数据时,支持并行执行,有更好的性能表现。

    4) 故障切换:在出现数据库故障时,因为支持多点写入,切的非常容易。

    5) 热插拔  :在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小。

    6) 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供, Galera Cluster会自动拉取在线节点数据,最终集群会变为一致。

    7) 对应用透明:集群的维护,对应用程序是透明的,几乎感觉不到

以上几点,足以说明Galera Cluster是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案

发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-13 04:04
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下