c语言问题求助

c语言,用的vc,想要的是做个顺序表,现在插入信息出问题了,之后输入的信息会盖掉之前所有的,用的结构体,这之中有int的name和字符串的sno,int型的没问题,但是字符串类型的先插入a,再插入b,b会盖掉a,显示的为b b,但是int的显示的就正常,算法写的结构都是一样的,求大神帮助,代码如下,红字部分为插入的算法,写的一样但是类型不同结构不同,小白求回答的详细点




#include"stdio.h"
#include "stdlib.h"
#include <string.h>


struct list
{
int max;
int n;
int name[100];
char *sno[100];
};
typedef struct list *plist;
//创建一个空的顺序表,最大值为m。n为0
plist create(int m)
{
plist a=(plist)malloc(sizeof(struct list));
if(a!=NULL)
{
a->name[100]=(int )malloc(sizeof(int)*m);
a->sno[10]=(char *)malloc(sizeof(char)*m);
if(a->name&&a->sno)
{
a->max=m;
a->n=0;
printf("success to create\n");
return a;
}
else 
{
free(a);
printf("free!");
}
}
else
printf("failed to create!");
return NULL;


}
//查询一个表是否为空表
int check(plist pl)
{
if(pl->n==0)
{
printf("empty\n");
return 0;
}
printf("not empty\n");
return 1;
}

//插入一个信息到顺序表,插入到第i个元素之前
void insert(plist pl,int i,int x,char sno[10])
{

int q;
if(pl->n<i)
{
printf("input error\n");
//return pl;
}
else
{

for(int q=pl->n-1;q>=i;q--)
{
pl->name[q+1]=pl->name[q];
pl->sno[q+1]=pl->sno[q];

}
pl->n++;
pl->name[i]=x;
pl->sno[i]=sno;
}

//return pl;

}

int visit(plist pl)
{
int flag=-1;
int i;
flag=check(pl);
if(!flag)
return 0;
else
{
for(i=0;i<pl->n;i++)
{
printf("%d:%d\n",i,pl->name[i]);
printf("%d:%s\n\n",i,pl->sno[i]);
}
}

}

void main()
{
list l;
plist pl;
char x[10];//存放姓名,方便输入,字符串
int loc=-1;//选择插入位置,插入在该参数之前
int id=-1;//id信息
int temp=0;
pl=create(10);
check(pl);


while(1)
{
printf("please press your name:\n");
scanf("%s",&x);
printf("press you id:");
scanf("%d",&id);
printf("please press which number you want put before:");
scanf("%d",&loc);
insert(pl,loc,id,x);
visit(pl);
}



/* list l;
int i=0;
plist pl; pl=create(10);
pl->sno[i]="tao";
i++;
pl->sno[i]="xin";
i++;
pl->sno[i]="cool";
pl->n=3;
visit(pl);*/
}




回答: c语言问题求助

  1. 按照我贴的代码改,运行一下看看有没有问题

    或者将pl->sno[i] = (char*)malloc(sizeof(char) * 10);改成
    pl->sno[i] = (char*)malloc(sizeof(char) * pl->max);就能发挥m参数的作用了

C++读取8位和24位bmp图到txt改写成c语言,求助

  1. Q
    #include<math.h>
    #include <iomanip>
    #include <stdlib.h>
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <fstream>
    #include<string>
    using namespace std;
    //以下该模块是完成BMP图像(彩色图像是24bit RGB各8bit)的像素获取,并存在文件名为xiang_su_zhi.txt中
    unsigned char *pBmpBuf;//读入图像数据的指针

    int bmpWidth;//图像的宽
    int bmpHeight;//图像的高
    RGBQUAD *pColorTable;//颜色表指针

    int biBitCount;//图像类型,每像素位数
    //-------------------------------------------------------------------------------------------
    //读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存,存放在相应的全局变量中
    bool readBmp(char *bmpName) 
    {
        FILE *fp=fopen(bmpName,"rb");//二进制读方式打开指定的图像文件

        if(fp==0) return 0;

        //跳过位图文件头结构BITMAPFILEHEADER

        fseek(fp, sizeof(BITMAPFILEHEADER),0);

        //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中

        BITMAPINFOHEADER head;  

        fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息

        bmpWidth = head.biWidth;

        bmpHeight = head.biHeight;

        biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)

        int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256

        if(biBitCount==8)
     {

            //申请颜色表所需要的空间,读颜色表进内存

            pColorTable=new RGBQUAD[256];

            fread(pColorTable,sizeof(RGBQUAD),256,fp);

     }

        //申请位图数据所需要的空间,读位图数据进内存

        pBmpBuf=new unsigned char[lineByte * bmpHeight];

        fread(pBmpBuf,1,lineByte * bmpHeight,fp);

        fclose(fp);//关闭文件

        return 1;//读取文件成功
    }
    //////-----------------------------------
    //-----------------------------------------------------------------------------------------
    //给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中
    bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, 

                 int biBitCount, RGBQUAD *pColorTable)

    {

        //如果位图数据指针为0,则没有数据传入,函数返回

        if(!imgBuf)

            return 0;

        //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0

        int colorTablesize=0;

        if(biBitCount==8)

            colorTablesize=1024;

        //待存储图像数据每行字节数为4的倍数

        int lineByte=(width * biBitCount/8+3)/4*4;

        //以二进制写的方式打开文件

        FILE *fp=fopen(bmpName,"wb");

        if(fp==0) return 0;

        //申请位图文件头结构变量,填写文件头信息

        BITMAPFILEHEADER fileHead;

        fileHead.bfType = 0x4D42;//bmp类型

        //bfSize是图像文件4个组成部分之和

        fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

            + colorTablesize + lineByte*height;

        fileHead.bfReserved1 = 0;

        fileHead.bfReserved2 = 0;

        //bfOffBits是图像文件前3个部分所需空间之和

        fileHead.bfOffBits=54+colorTablesize;

        //写文件头进文件

        fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);

        //申请位图信息头结构变量,填写信息头信息

        BITMAPINFOHEADER head; 

        head.biBitCount=biBitCount;

        head.biClrImportant=0;

        head.biClrUsed=0;

        head.biCompression=0;

        head.biHeight=height;

        head.biPlanes=1;

        head.biSize=40;

        head.biSizeImage=lineByte*height;

        head.biWidth=width;

        head.biXPelsPerMeter=0;

        head.biYPelsPerMeter=0;

        //写位图信息头进内存

        fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);

        //如果灰度图像,有颜色表,写入文件 

        if(biBitCount==8)

            fwrite(pColorTable, sizeof(RGBQUAD),256, fp);

        //写位图数据进文件

        fwrite(imgBuf, height*lineByte, 1, fp);

        //关闭文件

        fclose(fp);

        return 1;

    }
    /////----------------------------------------------------------
     void xiang_su_du_qu()

    {

        //读入指定BMP文件进内存

        char readPath[]="2117.BMP";

        readBmp(readPath);

        //输出图像的信息

        cout<<"width="<<bmpWidth<<" height="<<bmpHeight<<" biBitCount="<<biBitCount<<endl;
        
        //循环变量,图像的坐标

        //每行字节数

        int lineByte=(bmpWidth*biBitCount/8+3)/4*4;

        //循环变量,针对彩色图像,遍历每像素的三个分量

        int m=0,n=0,count_xiang_su=0;

        //将图像左下角1/4部分置成黑色
     
     ofstream outfile("图像像素.txt",ios::in|ios::trunc);

        if(biBitCount==8) //对于灰度图像
     {              
    //------------------------------------------------------------------------------------
    //以下完成图像的分割成8*8小单元,并把像素值存储到指定文本中。由于BMP图像的像素数据是从
    //左下角:由左往右,由上往下逐行扫描的
          
        //int L2=0;
              //int fen_ge=8;
        for(int i=bmpHeight-1;i>=0;i--)//64*64矩阵行循环
        { 
         for(int j=0;j<bmpWidth;j++)//64*64列矩阵循环
         { 
          //--------------------------------------------
         
            m=*(pBmpBuf+i*lineByte+j);
    outfile<<setw(4)<<m;
                                // outfile<<m<<"  ";
                     count_xiang_su=count_xiang_su+1;
                 if((count_xiang_su)%(bmpWidth)==0)//
          {
               outfile<<endl;
        }
            
         }
        
        }
     }

        //double xiang_su[2048];
     //ofstream outfile("xiang_su_zhi.txt",ios::in|ios::trunc);
     if(!outfile)
     {
      cout<<"open error!"<<endl;
       exit(1);
     }
        else if(biBitCount==24){//彩色图像

            for(int i=0;i<bmpHeight;i++)
      {

                for(int j=0;j<bmpWidth;j++)
       { 

                    for(int k=0;k<3;k++)//每像素RGB三个分量分别置0才变成黑色

        {
         //*(pBmpBuf+i*lineByte+j*3+k)-=40;
                        m=*(pBmpBuf+i*lineByte+j*3+k);
            outfile<<m<<" ";
         count_xiang_su++;
         if(count_xiang_su%bmpWidth==0)
         {
          outfile<<endl;
         }
         //n++;
        }
                  n++;
                }

    }
      cout<<"总的像素个素为:"<<n<<endl;
      cout<<"----------------------------------------------------"<<endl;

        }
        
        //将图像数据存盘
        
        char writePath[]="nvcpy.BMP";//图片处理后再存储

        saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);

        //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间

        delete []pBmpBuf;

        if(biBitCount==8)

            delete []pColorTable;

    }
    void main()
    {
        xiang_su_du_qu();
    }
    是c++写的     我现在急需纯c语言写的,自己尝试了不行    求助
  2. A
    修改如下:

    #include<math.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    //以下该模块是完成BMP图像(彩色图像是24bit RGB各8bit)的像素获取,并存在文件名为xiang_su_zhi.txt中
    unsigned char *pBmpBuf;//读入图像数据的指针

    int bmpWidth;//图像的宽
    int bmpHeight;//图像的高
    RGBQUAD *pColorTable;//颜色表指针

    int biBitCount;//图像类型,每像素位数
       //-------------------------------------------------------------------------------------------
       //读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存,存放在相应的全局变量中
    bool readBmp(char *bmpName)
    {
    FILE *fp = fopen(bmpName, "rb");//二进制读方式打开指定的图像文件

    if (fp == 0) return 0;

    //跳过位图文件头结构BITMAPFILEHEADER

    fseek(fp, sizeof(BITMAPFILEHEADER), 0);

    //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中

    BITMAPINFOHEADER head;

    fread(&head, sizeof(BITMAPINFOHEADER), 1, fp); //获取图像宽、高、每像素所占位数等信息

    bmpWidth = head.biWidth;

    bmpHeight = head.biHeight;

    biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)

    int lineByte = (bmpWidth * biBitCount / 8 + 3) / 4 * 4;//灰度图像有颜色表,且颜色表表项为256

    if (biBitCount == 8)
    {

    //申请颜色表所需要的空间,读颜色表进内存

    //pColorTable = new RGBQUAD[256];  //对应如下的C代码
    pColorTable = malloc(sizeof(RGBQUAD) * 256);

    fread(pColorTable, sizeof(RGBQUAD), 256, fp);

    }

    //申请位图数据所需要的空间,读位图数据进内存

    //pBmpBuf = new unsigned char[lineByte * bmpHeight];
    pBmpBuf = malloc(sizeof(unsigned char)*lineByte * bmpHeight);

    fread(pBmpBuf, 1, lineByte * bmpHeight, fp);

    fclose(fp);//关闭文件

    return 1;//读取文件成功
    }
    //////-----------------------------------
    //-----------------------------------------------------------------------------------------
    //给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中
    bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,

    int biBitCount, RGBQUAD *pColorTable)

    {

    //如果位图数据指针为0,则没有数据传入,函数返回

    if (!imgBuf)

    return 0;

    //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0

    int colorTablesize = 0;

    if (biBitCount == 8)

    colorTablesize = 1024;

    //待存储图像数据每行字节数为4的倍数

    int lineByte = (width * biBitCount / 8 + 3) / 4 * 4;

    //以二进制写的方式打开文件

    FILE *fp = fopen(bmpName, "wb");

    if (fp == 0) return 0;

    //申请位图文件头结构变量,填写文件头信息

    BITMAPFILEHEADER fileHead;

    fileHead.bfType = 0x4D42;//bmp类型

     //bfSize是图像文件4个组成部分之和

    fileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

    + colorTablesize + lineByte*height;

    fileHead.bfReserved1 = 0;

    fileHead.bfReserved2 = 0;

    //bfOffBits是图像文件前3个部分所需空间之和

    fileHead.bfOffBits = 54 + colorTablesize;

    //写文件头进文件

    fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);

    //申请位图信息头结构变量,填写信息头信息

    BITMAPINFOHEADER head;

    head.biBitCount = biBitCount;

    head.biClrImportant = 0;

    head.biClrUsed = 0;

    head.biCompression = 0;

    head.biHeight = height;

    head.biPlanes = 1;

    head.biSize = 40;

    head.biSizeImage = lineByte*height;

    head.biWidth = width;

    head.biXPelsPerMeter = 0;

    head.biYPelsPerMeter = 0;

    //写位图信息头进内存

    fwrite(&head, sizeof(BITMAPINFOHEADER), 1, fp);

    //如果灰度图像,有颜色表,写入文件 

    if (biBitCount == 8)

    fwrite(pColorTable, sizeof(RGBQUAD), 256, fp);

    //写位图数据进文件

    fwrite(imgBuf, height*lineByte, 1, fp);

    //关闭文件

    fclose(fp);

    return 1;

    }
    /////----------------------------------------------------------
    void xiang_su_du_qu()

    {

    //读入指定BMP文件进内存

    char readPath[] = "2117.BMP";

    readBmp(readPath);

    //输出图像的信息

    //cout << "width=" << bmpWidth << " height=" << bmpHeight << " biBitCount=" << biBitCount << endl;
    printf("width=%d, height=%d, biBitCount=%d\n", bmpWidth, bmpHeight, biBitCount);  //具体类型你知道

    //循环变量,图像的坐标

    //每行字节数

    int lineByte = (bmpWidth*biBitCount / 8 + 3) / 4 * 4;

    //循环变量,针对彩色图像,遍历每像素的三个分量

    int m = 0, n = 0, count_xiang_su = 0;

    //将图像左下角1/4部分置成黑色

    //ofstream outfile("图像像素.txt", ios::in | ios::trunc); 对应如下两行C代码
    FILE *outfile;
    fopen("图像像素.txt", "r+");

    if (biBitCount == 8) //对于灰度图像
    {
    //------------------------------------------------------------------------------------
    //以下完成图像的分割成8*8小单元,并把像素值存储到指定文本中。由于BMP图像的像素数据是从
    //左下角:由左往右,由上往下逐行扫描的

    //int L2=0;
    //int fen_ge=8;
    for (int i = bmpHeight - 1; i >= 0; i--)//64*64矩阵行循环
    {
    for (int j = 0; j<bmpWidth; j++)//64*64列矩阵循环
    {
    //--------------------------------------------

    m = *(pBmpBuf + i*lineByte + j);
    //outfile << setw(4) << m;
    printf("%4d", m);
    // outfile<<m<<"  ";
    count_xiang_su = count_xiang_su + 1;
    if ((count_xiang_su) % (bmpWidth) == 0)//
    {
    //outfile << endl;
    printf('\n');
    }
    }

    }
    }

    //double xiang_su[2048];
    //ofstream outfile("xiang_su_zhi.txt",ios::in|ios::trunc);
    if (!outfile)
    {
    //cout << "open error!" << endl;
    printf("open error!\n");
    exit(1);
    }
    else if (biBitCount == 24) {//彩色图像

    for (int i = 0; i<bmpHeight; i++)
    {

    for (int j = 0; j<bmpWidth; j++)
    {

    for (int k = 0; k<3; k++)//每像素RGB三个分量分别置0才变成黑色

    {
    //*(pBmpBuf+i*lineByte+j*3+k)-=40;
    m = *(pBmpBuf + i*lineByte + j * 3 + k);
    //outfile << m << " ";
    printf("%d ", m);
    count_xiang_su++;
    if (count_xiang_su%bmpWidth == 0)
    {
    //outfile << endl;
    printf('\n');
    }
    //n++;
    }
    n++;
    }

    }
    //cout << "总的像素个素为:" << n << endl;
    printf("总的像素个素为:%d\n", n);
    //cout << "----------------------------------------------------" << endl;
    printf("----------------------------------------------------\n");
    }

    //将图像数据存盘

    char writePath[] = "nvcpy.BMP";//图片处理后再存储

    saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);

    //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间

    //delete[]pBmpBuf;
    free(pBmpBuf);

    if (biBitCount == 8)
    //delete[]pColorTable;
    free(pColorTable);

    }
    void main()
    {
    xiang_su_du_qu();
    }

c语言新手求助~

  1. Q
    #include<stdio.h>
    #include<string.h>
    void SwapString(char *source ,char *des);
    int main(void)
    {
    char *str1="Japan";
    char *str2="Chinese";
    SwapString(str1,str2);
    return 0;
    }
    void SwapString(char *source, char *des)
    {
    int i=0;
    char temp;
    while(temp!='\0')
    {
    temp=*(source+i);
    *(source+i)=*(des+i);//这个步骤的调试为什么会报错呢?错在哪里了呢?求解答,3q
    *(des+i)=temp;
    i++;
    }
    }
  2. A
    分享下曾经做过的类似题目,希望可以对楼主学习有些帮助.c语言新手求助~

    字符串2插入到字符串1中
    http://www.cnblogs.com/xingyunblog/p/3657691.html
    字符串插入以及字符串结束标志的考察
    http://www.cnblogs.com/xingyunblog/p/3951053.html

一段VBA转化VB语言的求助

  1. Q
    VBA中一段代码:
    Dim p As Varint
    p = ThisDrawing.Utility.GetPoint(, vbCrLf & "First point: ") 
    '鼠标点取获得P点坐标

    如何将其转化为VB代码?
    我尝试
    p = acadApp.ActiveDocument.Utility.GetPoint(, vbCrLf & "First point: ")
    显示事实错误'424'
    要求对象
    求指点
  2. A
    可能是需要获取对象的原因吧。这样试一下:

        Dim cadApp As Object
        Dim p As Variant
        Set cadApp = CreateObject("AutoCAD.Application")
        p = cadApp.ActiveDocument.Utility.GetPoint(, vbCrLf & "Frst Point: ")

初学菜鸟求各位大神帮助

  1. Q
    各位大神,初学c语言菜鸟求助
    图中第六题的结果我看不懂,求解答
  2. A
    请问图在哪里?耐心上传,我们为你解答

新手求助[文本]C语言如何删除文本内指定的的字符或单词 插入字符或单词怎么实现?

  1. Q
    我们大一C语言要做课程设计,最后这些功能实在不会实现,因为课讲得慢,对文本的处理方法不懂,恳求各位分享下处理思路,感激不尽!告诉我大概处理思路就行,我是个初学者,很多东西不懂,要讲得浅显点哦~新手求助[文本]C语言如何删除文本内指定的的字符或单词 插入字符或单词怎么实现?


    现在我不会实现的功能是:
          1、删除文本内的字符或单词串
          2、 插入字符或者单词串
          3、替换字符或单词
          4、每个单词最后一个字母改为大写
    处理完的结果都要保存回原txt文件

    这些功能如果是针对数组实现,我都会。但针对文本实现这些功能,一点都不懂。其实我只是不知道怎么样处理文本数据比较方便,希望能得到各位前辈的帮助!!先谢谢!

    新人报道。
    第一次发帖,不知道积分有什么用,不过还是省点吧…新手求助[文本]C语言如何删除文本内指定的的字符或单词 插入字符或单词怎么实现?
  2. A
    既然是初学者, 那就不要考虑太多. 
    最简单的实现场景即可.
    1. 读取原文件到内存缓冲区.  (可以假定文件不超过1K)
    2. 按需要增删改查字符串.
    3. 重新写回文件.
    先做好这个, 再来看1楼提到大文件操作, 你就明白得多了.

C语言读写文件求助

  1. Q
    代码如下:

    #include "stdafx.h"
    #define FILENAME1 "filename1.txt"
    #define FILENAME2 "filename2.txt"
    #define NUM 10


    int _tmain(int argc, _TCHAR* argv[])
    {
    FILE* p1=NULL;//文件指针,指向读入数据的文件
    FILE* p2=NULL;//文件指针,指向需要修改的文件
    int i;        //循环控制变量,控制读写次数
    char ch;
    char buff[1024];
    char read_fpxxfpje[9];
    //write_fpxxfpje[10];
    if ((p1 = fopen(FILENAME1, "rb")) == NULL)
    {
    printf("读取文件失败,按回车键退出!\n");     //输出错误提示
    while (1)                                  //死循环控制错误提示
    {
    ch = getchar();
    if (ch == '\n')break;                    //满足条件退出循环
    }
    exit(1);
    }
    if ((p2 = fopen(FILENAME2, "rb+")) == NULL)
    {
    printf("写入文件失败,按回车键退出!\n");     //输出错误提示
    while (1)                                  //死循环控制错误提示
    {
    ch = getchar();
    if (ch == '\n')break;                    //满足条件退出循环
    }
    exit(1);
    }
    memset(buff, 0, 1024);                         //数组元素置零
    for (i = 0; i < NUM; i++)
    {
    if (fgets(buff, 1024, p1) != NULL)              //检查能否读取read指向文件的第一行数据
    {
    memset(read_fpxxfpje, 0, 9);
    memcpy(read_fpxxfpje, buff + 514, 8);             //复制read指向文件第一行数据第514~523个数据,赋予read_fpxx.fpje
    printf("read_fpxx.fpje:%s\n", read_fpxxfpje);  //输出.fpje的值
    }
    else
    printf("获取第%d行数据失败",i);                    //不能打开文件提示错误信息
    if (fgets(buff, 1024, p2) != NULL)            //检查能否读取数据
    {
    fseek(p2, 32L,0);
    fputs(read_fpxxfpje, p2);
        fseek(p2, 109L, 1);
    }
    else
    printf("写入第%d行数据失败", i);
    }
    fclose(p1);
    fclose(p2);
    while (1)                                  //死循环控制错误提示
    {
    printf("程序执行完成,请按回车键退出程序!");
    ch = getchar();
    if (ch == '\n')break;                    //满足条件退出循环
    }
    exit(1);
    return 0;
    }


    想读filename1文件的固定内容,然后写入到filename2文件的固定位置,现在解决不了的问题是写的时候重复写在第一行。。

    if (fgets(buff, 1024, p2) != NULL)            //检查能否读取数据
    {
    fseek(p2, 32L,0);
    fputs(read_fpxxfpje, p2);
        fseek(p2, 109L, 1);
    }
    else
    printf("写入第%d行数据失败", i);

    我觉得应该是上面这个fseek(p2,32L,0)这部分出了问题,每循环一次都把光标移到文件开头位置往后32L的地方了,有没有办法让此句只运行一次?或者有其他办法解决光标的位置问题不?BAIDU了好久找不到办法来求助各位。。
  2. A
    fopen, _wfopen
    Open a file.

    FILE *fopen( const char *filename, const char *mode );

    FILE *_wfopen( const wchar_t *filename, const wchar_t *mode );

    Function Required Header Compatibility 
    fopen <stdio.h> ANSI, Win 95, Win NT 
    _wfopen <stdio.h> or <wchar.h> Win NT 


    For additional compatibility information, see Compatibility in the Introduction.

    Libraries

    LIBC.LIB Single thread static library, retail version 
    LIBCMT.LIB Multithread static library, retail version 
    MSVCRT.LIB Import library for MSVCRT.DLL, retail version 


    The c, n, and t mode options are Microsoft extensions for fopen and _fdopen and should not be used where ANSI portability is desired.

    Return Value

    Each of these functions returns a pointer to the open file. A null pointer value indicates an error. 

    Parameters

    filename

    Filename

    mode

    Type of access permitted

    Remarks

    The fopen function opens the file specified by filename. _wfopen is a wide-character version of fopen; the arguments to _wfopen are wide-character strings. _wfopen and fopen behave identically otherwise.

    Generic-Text Routine Mappings

    TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined 
    _tfopen fopen fopen _wfopen 


    The character string mode specifies the type of access requested for the file, as follows:

    "r"

    Opens for reading. If the file does not exist or cannot be found, the fopen call fails.

    "w"

    Opens an empty file for writing. If the given file exists, its contents are destroyed.

    "a"

    Opens for writing at the end of the file (appending) without removing the EOF marker before writing new data to the file; creates the file first if it doesn’t exist.

    "r+"

    Opens for both reading and writing. (The file must exist.)

    "w+"

    Opens an empty file for both reading and writing. If the given file exists, its contents are destroyed.

    "a+"

    Opens for reading and appending; the appending operation includes the removal of the EOF marker before new data is written to the file and the EOF marker is restored after writing is complete; creates the file first if it doesn’t exist.

    When a file is opened with the "a" or "a+" access type, all write operations occur at the end of the file. The file pointer can be repositioned using fseek or rewind, but is always moved back to the end of the file before any write operation is carried out. Thus, existing data cannot be overwritten.

    The "a" mode does not remove the EOF marker before appending to the file. After appending has occurred, the MS-DOS TYPE command only shows data up to the original EOF marker and not any data appended to the file. The "a+" mode does remove the EOF marker before appending to the file. After appending, the MS-DOS TYPE command shows all data in the file. The "a+" mode is required for appending to a stream file that is terminated with the CTRL+Z EOF marker.

    When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for “update”). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation, if desired.


    In addition to the above values, the following characters can be included in mode to specify the translation mode for newline characters:

    t

    Open in text (translated) mode. In this mode, CTRL+Z is interpreted as an end-of-file character on input. In files opened for reading/writing with "a+", fopen checks for a CTRL+Z at the end of the file and removes it, if possible. This is done because using fseek and ftell to move within a file that ends with a CTRL+Z, may cause fseek to behave improperly near the end of the file. 

    Also, in text mode, carriage return–linefeed combinations are translated into single linefeeds on input, and linefeed characters are translated to carriage return–linefeed combinations on output. When a Unicode stream-I/O function operates in text mode (the default), the source or destination stream is assumed to be a sequence of multibyte characters. Therefore, the Unicode stream-input functions convert multibyte characters to wide characters (as if by a call to the mbtowc function). For the same reason, the Unicode stream-output functions convert wide characters to multibyte characters (as if by a call to the wctomb function).

    b

    Open in binary (untranslated) mode; translations involving carriage-return and linefeed characters are suppressed. 

    If t or b is not given in mode, the default translation mode is defined by the global variable _fmode. If t or b is prefixed to the argument, the function fails and returns NULL. 

    For more information about using text and binary modes in Unicode and multibyte stream-I/O, see Text and Binary Mode File I/O and Unicode Stream I/O in Text and Binary Modes.

    c

    Enable the commit flag for the associated filename so that the contents of the file buffer are written directly to disk if either fflush or _flushall is called.

    n

    Reset the commit flag for the associated filename to “no-commit.” This is the default. It also overrides the global commit flag if you link your program with COMMODE.OBJ. The global commit flag default is “no-commit” unless you explicitly link your program with COMMODE.OBJ.

    Valid characters for the mode string used in fopen and _fdopen correspond to oflag arguments used in _open and _sopen, as follows.

    Characters in mode String Equivalent oflag Value for _open/_sopen
     
    a _O_WRONLY | _O_APPEND (usually _O_WRONLY | _O_CREAT | _O_APPEND) 
    a+ _O_RDWR | _O_APPEND (usually _O_RDWR | _O_APPEND | _O_CREAT ) 
    r _O_RDONLY 
    r+ _O_RDWR 
    w _O_WRONLY (usually _O_WRONLY | _O_CREAT | _O_TRUNC) 
    w+ _O_RDWR (usually _O_RDWR | _O_CREAT | _O_TRUNC) 
    b _O_BINARY 
    t _O_TEXT 
    c None 
    n None 


    Example

    /* FOPEN.C: This program opens files named "data"
     * and "data2".It  uses fclose to close "data" and
     * _fcloseall to close all remaining files.
     */

    #include <stdio.h>

    FILE *stream, *stream2;

    void main( void )
    {
       int numclosed;

       /* Open for read (will fail if file "data" does not exist) */
       if( (stream  = fopen( "data", "r" )) == NULL )
          printf( "The file 'data' was not opened\n" );
       else
          printf( "The file 'data' was opened\n" );

       /* Open for write */
       if( (stream2 = fopen( "data2", "w+" )) == NULL )
          printf( "The file 'data2' was not opened\n" );
       else
          printf( "The file 'data2' was opened\n" );

       /* Close stream */
       if( fclose( stream ) )
          printf( "The file 'data' was not closed\n" );

       /* All other files are closed: */
       numclosed = _fcloseall( );
       printf( "Number of files closed by _fcloseall: %u\n", numclosed );
    }


    Output

    The file 'data' was opened
    The file 'data2' was opened
    Number of files closed by _fcloseall: 1


    Stream I/O Routines

    See Also   fclose, _fdopen, ferror, _fileno, freopen, _open, _setmode

求助C语言一个基础数组问题

  1. Q
    最近看老师说的 在C语言的数组中
    a[i]等价于*(a+i)
    表示有点不理解.
    a作为该数组中的首地址,比如为0x0030f85c
    如果a[0]等价于*(a+0)这点没问题
    如果a[1]等价于*(a+1),这里0x0030f85c+1不是该等于0x0030f85d么.
    而a[1]的地址要根据a的类型来计算,int 型的话.那么&a[1]不是就该等于0x0030f85c+4=0x0030F860,那样的话*(a+1)就并不等价于a[i]了.
    是不是我有什么地方理解错误.望指教
  2. A
    数组元素有类型,数组的首地址进行数值运算时,偏移量要乘以数组元素类型大小
    换言之
    a + 1 = 0x0030f85c + 1 * sizeof(int)

求助,由于要用其它语言重写DELPHI函数,请帮忙注释下以下代码

  1. Q

    function TdmBase.SendDataA(const strData: string; serverIP: string):string;
    var
      tcpClient: TTcpClient;
      strBase64Str: string;
      Data: array of Byte;
      Base64Data: string;
      rcvbuffer:array[0..65535] of char;
      bytes: TByte10;
      len: integer;
      lenstr,recvlen,i,n: integer;
      flag: boolean;
    begin
      strBase64Str := StrToBase64(strData); 
      len := GetBytes(length(strBase64Str),0,bytes);//?不理解
      setlength(data,length(strBase64Str) + len);//设置Data的长度
      move(bytes[0],Data[0],len);//?有点模糊
      move(PChar(strBase64Str)[0],Data[len],length(strBase64Str));//?有点模糊
      tcpClient := TTCPClient.Create(nil);
      tcpClient.BlockMode := bmBlocking;
      tcpClient.RemoteHost := serverIP;
      tcpClient.RemotePort := '8899';
      recvlen := 0;
      lenstr := 0;
      Base64Data := '';
      flag := false;
      if tcpClient.Connect then
      begin
        tcpClient.SendBuf(Data[0],length(strBase64Str) + len);
        while(tcpClient.WaitForData(10000)) do
        begin
          n := tcpClient.ReceiveBuf(rcvbuffer,65536); //将client端数据取到rcvbuffer中
          if not flag then
          begin
            for i := 0 to n - 1 do
            begin
              if (ord(rcvbuffer[i]) < 128) then
              begin
                lenstr := lenstr + ord(rcvbuffer[i]) * TRUNC(power(128,recvlen + i));
                flag := true;
                if (i < n - 1) then
                  Base64Data := Base64Data + copy(rcvbuffer,i + 2,n - 1 - i);
                break;
              end
              else
              begin
                lenstr := lenstr + (ord(rcvbuffer[i]) - 128) * TRUNC(power(128,recvlen + i));
              end;
            end;
          end
          else
          begin
            Base64Data := Base64Data + copy(rcvbuffer,1,n);
          end;
          if flag and (length(Base64Data) = lenstr) then
          begin
            result := Base64ToStr(Base64Data);
            break;
          end;
          recvlen := recvlen + n;
        end;
        tcpClient.Close();
      end
      else
      begin
        result := '2.请检查服务器IP是否正确或网络是否连通。';
        exit;
      end;
    end;


    多谢各位!
  2. A
    通过socket发数据,你想要翻译成啥语言

求助~!PE文件结构分析用那种语言实现比较好?

  1. Q
    想学软件安全方面的知识,要求编写PE文件结构分析的程序作为入门,并且要求用两种语言实现。

    已经学会用C语言简单编写了一个,但是第二种语言不知道用什么好。。

    求各位推荐!求助~!PE文件结构分析用那种语言实现比较好?
  2. A
    《Windows PE权威指南》