2013-07-09 27 views
0

我使用C语言编程,我试图读取每一行的第一个字符串中的二进制文件。从二进制文件中读取不成功用C

二进制文件数据的实例(我已经写了一个txt文件,以显示你)

Iliya Iliya Vaitzman 16.00以色列1 0 1

我想读第一个伊利亚在该行(或者该行的第一个词将是什么)。

我想下面的代码,但它一直返回NULL的字符串变量我给他

下面的代码:

FILE* ptrMyFile; 
    char usernameRecieved[31]; 
    boolean isExist = FALSE; 
    ptrMyFile = fopen(USERS_CRED_FILENAME, "a+b"); 
    if (ptrMyFile) 
    { 
     while (!feof(ptrMyFile) && !isExist) 
     { 
      fread(usernameRecieved, 1, 1, ptrMyFile); 
      if (!strcmp(userName, usernameRecieved)) 
      { 
       isExist = TRUE; 
      } 
     } 
    } 
    else 
    { 
     printf("An error has encountered, Please try again\n"); 
    } 
    return isExist; 

我用的typedef和#定义一个布尔变量(0假的,一切是真(TRUE是真的,假的就是假))

usernameRecieved保持从FREAD越来越NULL。

我应该怎么才能解决这个问题呢?

+0

你知道,你只是在FREAD读取一个字节()? –

+0

二进制文件的格式是什么?你不能只用'freed()'从一个二进制文件中读取一个C字符串,除非'\ 0'终止,并且你知道确切的位置和长度。 'userName'没有被定义。 –

+0

您的文件读取逻辑错误。只有当_already尝试读取file_结尾时,'feof()'函数才返回非零值。这意味着,在成功读取文件中的最后一条记录后,'feof()'返回false,然后执行另一个'fread()'并继续使用结果。 FREAD的'的返回值()'为已读取对象的数量,所以正确的做法是要始终测试FREAD()'的'的返回值,如果该值是零或其他“错误”,_then_你检查'feof()'并决定是否退出循环。 (另请参阅'ferror()'。) –

回答

0

取而代之的是:

fread(usernameRecieved, 1, 1, ptrMyFile); 

试试这个:

memset(usernameRecieved, 0, sizeof(usernameRecieved)); 
fread(usernameRecieved, sizeof(usernameRecieved)-1, 1, ptrMyFile); 

正因为如此,你顶多从文件读取只有一个字节。

+0

我仍然收到相同的 [img] http://ufu.co.il/files/ox3rzk25hr6rqk51o5j2.jpg [/ img] –

+0

该文件是否真的包含数据并存在? – Devolus

+0

谢谢,这工作! –

0

Documentation on fread

有两件事情:你在FREAD计数字段设置为1,所以你只读过1个字节,最多(假设你不打一个EOF或其他终端标记)。 这可能是你想要的是:

fread(usernameRecieved, 1, 31, ptrMyFile); 

这样,你会复制到你的整个字符缓冲区。然后,您只需比较您使用的任何分隔符(空格,句号等)。

目前还不清楚是什么“usernameRecieved状态越来越空”的意思; usernameRecieved在堆栈中(您没有使用malloc)。你的意思是什么都没有被读取?我强烈建议你经常检查fread的返回值,看看有多少读取;这对调试很有帮助。

+0

不过,我收到相同的。 http://ufu.co.il/files/ox3rzk25hr6rqk51o5j2.jpg –

+0

这不是空,这是一大堆'M's ...你的输入文件是否有一堆女士/是否良好形成和存在? – akroy