#include "stdafx.h"
#include <afx.h>
#include <iostream.h>int main(int argc, char* argv[])
{
CFile file;
file.Open(_T("C:\\Documents and Settings\\Administrator\\桌面\\text.txt"),
       CFile::modeReadWrite);  //打开txt文档,文档里面存的是数字 char pszData[32] = {0};

int nCount = file.Read(pszData,sizeof(pszData)); cout<<nCount<<endl; CString str;
str.Format("%d, %d, %d, %d", pszData[0], pszData[1], pszData[2], pszData[3]);
cout<<str<<endl; str.Format("%x, %x, %x, %x", pszData[0], pszData[1], pszData[2], pszData[3]);
cout<<str<<endl; return 0;
}为什么得到的数据不是实际的呢?

解决方案 »

  1.   

    是不是超出char所能表示的范围了。。换个数据类型试下。。
      

  2.   

    char pszData[32] = {0}; =>  int pszData[32] = {0}; 试试
      

  3.   

    读txt文件的话,用CStdioFile::ReadString
      

  4.   

    LZ用Win32编的吧,CFile是MFC的基类,不能用。
      

  5.   


    我想把他们读出来,然后用十六进制输出,如果是CString对象的话,如何判断呢??
      

  6.   

    如果有回车、换行的话,用fgets读一行数据,然后用sscanf把数字分离出来
      

  7.   

    参考一下:CFileDialog dlg(TRUE, _T("SQL"), _T(""),OFN_HIDEREADONLY
          |OFN_OVERWRITEPROMPT,_T("文本文档(*.txt)|*.txt|头文件(*.h)|*.h|源文件(*.c;*.cpp)|*.c;*.cpp|数据库文件(*.sql)|*.sql|All Files(*.*)|*.*||")); 
    if ( dlg.DoModal()!=IDOK ) return;
    CString sFileName=dlg.GetPathName();
    //打开文件
    CStdioFile out;
    out.Open(sFileName, CFile::modeRead);
    CString sSql,s;
    sSql="";
    //读取文件
    do{
    out.ReadString(s);
    sSql=sSql+s+(char)10;
    }
    while (out.GetPosition()!=out.GetLength());
    out.Close(); 
      

  8.   

    如果是二进制格式,则看写的时候是大、小端,然后再读
    既,得整体读一个int,而不是按byte读
      

  9.   

    fstream int_file(_T("D:\\") + strPath + _T(".txt"), ios::out|ios::in); 
    int_file.write(pBuffer, fieldInfo->m_lSize +1);
    int_file.close();
    m_Web.Navigate(_T("D:\\") + strPath +_T(".pdf"), NULL, NULL, NULL, NULL);参考下吧。
      

  10.   

    memory:
    00A61A0C  31 32 33 34 35 36 37  1234567
    00A61A13  38 39 00 CD CD CD CD  89.屯屯现在的问题是,里面的每一位前面都多出来一个3,不知道什么情况···
      

  11.   

    这么试下。。 using namespace std; CString strFilePath = (_T("C:\\Documents and Settings\\Administrator\\桌面\\text.txt"); fstream infile(strFilePath); string strline;
    vector<string> vStr; while( !infile.eof() )
    {
    getline(infile, strline);
    vStr.push_back(strline));
    }
    for( size_t i = 0; i < vStr.size(); i++ )
    {
    istringstream istr(vStr[i]);
    int i1, i2, i3, i4;
    istr>>i1>>i2>>i3>>i4; CString str; str.Format("%d, %d, %d, %d", i1, i2, i3, i4);
    cout<<str<<endl; str.Format("%x, %x, %x, %x", i1, i2, i3, i4);
    cout<<str<<endl;
    }
      

  12.   

    所以,如果txt里面的是1 ,那么读出来的数字就是 31(16进制)
          如果txt里面的是2 ,那么读出来的数字就是 32(16进制)
      

  13.   

    你通过文本查看的是字符,实际记录的是它的ASCII码
    所以你Read到的也是ASCII码
      

  14.   


    如果这样的话,1就应该是49,而不是31,不是ASCII码
      

  15.   

    int main(int argc, char* argv[])
    {
    CFile file;
    file.Open(_T("C:\\Documents and Settings\\Administrator\\桌面\\text.txt"),
    CFile::modeReadWrite); //打开txt文档,文档里面存的是数字char pszData[32] = {0};for(int i=0;i<32;i++)
     file.Read(&pszData,sizeof(pszData));
    CString str[4];for( i=0;i<4;i++)
    {
    str[i].Format("%d, %d, %d, %d", pszData[0], pszData[1], pszData[2], pszData[3]);
    cout<<str[i]<<endl;
    }for( i=0;i<4;i++)
    {
    str[i].Format("%x, %x, %x, %x", pszData[0], pszData[1], pszData[2], pszData[3]);
    cout<<str[i]<<endl;
    }
    return 0;
    }你再试试,在Win32中没有CFile和CString这些类,Format也不能用,只能在MFC中使用
      

  16.   

    str[i].Format("%d", pszData[i]);这个地方改成这样- -
      

  17.   

    我前两天也是在用CFile读取数据时遇到各种错误,这里是我的解决方案希望能帮到你
    //使用CStdioFile读取文件
    //不要忘记 #include "afx.h"typedef unsigned int UINT;UINT ReadData(bool ErrFlag=false)
    {
    CString TmpCStr;
    CStdioFile File; File.Open(DataFileName,CFile::modeRead); File.ReadString(TmpCStr);  //将整个数据一次性读入 wchar_t pszData[32]={0};   //初始化,使用wchar_t而不是char for(int i=0;i<32;i++)    //从读入的全部数据中找出自己想要的部分就可以了。
    {
    pszData[i]=TmpCStr.GetAt(i);
    } //.... return -1;
    }
      

  18.   

    如果是一行一行地读,可以使用ReadString函数啊
      

  19.   

    或许要注意ASCI码与数值的转换吧
      

  20.   

    读txt文件的话,用CStdioFile::ReadString
      

  21.   

    感谢各位,我明白了,1的ASCI码就是49,然后49在16进制下就是31,所以输出0x31是正确的~~~
    以后还是希望大家多多帮忙,谢谢
      

  22.   

    请看下面代码:#define _AFXDLL
    #include <afxwin.h> //控制台使用CString
    #include <iostream>using namespace std;int main(int argc, char* argv[])
    {
    CFile file;
    file.Open(_T("C:\\Documents and Settings\\Administrator\\桌面\\text.txt"),
    CFile::modeReadWrite); //打开txt文档,文档里面存的是数字 char pszData[32] = {0}; int nCount = file.Read(pszData,sizeof(pszData)); CString str;
    //pszData[0],pszData[1]..本身为字符 所以格式字符串用%c
    str.Format("%c, %c, %c, %c", pszData[0], pszData[1], pszData[2], pszData[3]);
    //或str.Format("%d, %d, %d, %d", pszData[0]-48, pszData[1]-48, pszData[2]-48, pszData[3]-48);
    cout<<str<<endl;

    //例如 字符 '1' - 48 == 1 
    str.Format("%x, %x, %x, %x", pszData[0]-48, pszData[1]-48, pszData[2]-48, pszData[3]-48);
    cout<<str<<endl; return 0;
    }
      

  23.   

    %d对应int,你传入char明显是错误的.
    自己学习一下printf的用法吧.
      

  24.   

    看了回答才知道CSDN上的高手真多呀。不过高手都得加上引号的。哎,不能想明白了再上来回答吗?
      

  25.   

    看了你的程序,首要的问题是这一句
    int nCount = file.Read(pszData,sizeof(pszData));
    这里sizeof(pszData)应该返回是4,也就是4个字节的意思。因为pszData实质上是一个32位的指针。
    另外还要考虑字符编码是unicode还是多字节编码。想要了解更多的信息参考MSDN CStringT().
      

  26.   

    CString str;
    str.Format("%d, %d, %d, %d", pszData[0], pszData[1], pszData[2], pszData[3]);
    cout<<str<<endl;
    这是ASCII char -> AscII十进制数CString str;
    str.Format("%c, %c, %c, %c", pszData[0], pszData[1], pszData[2], pszData[3]);
    cout<<str<<endl;
    这是ASCII char是对的没有问题,是你用的格式输出符有问题!!
      

  27.   

    file.Read(pszData,sizeof(pszData));不是直接把数字读进来吧
      

  28.   


    没有错,输出对应的ASCII码值
      

  29.   


    char pszData[32];
    所以sizeof(pszData)的值是32,在这里不退化为指针
    如果你觉得我说的不是,你可以上机运行一下,结果就是32
      

  30.   


    1的ASCII 码是31,For Hexadecimal.........