读取C中的一行并将其拆分

时间:2015-05-23 23:07:29

标签: c fread scanf

我试图分裂' str'在2个int变量和1个char变量中。这是一个代码:

int imagescount = 0;
        private void SaveImageFromWebBrowser()
        {
            IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument;
            IHTMLControlRange imgRange = (IHTMLControlRange)((HTMLBody)doc.body).createControlRange();

            foreach (IHTMLImgElement img in doc.images)
            {
                imgRange.add((IHTMLControlElement)img);

                imgRange.execCommand("Copy", false, null);

                using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap))
                {
                    bmp.Save(@"e:\webbrowserimages\Image" + imagescount.ToString("D6") + ".bmp",
                             System.Drawing.Imaging.ImageFormat.Bmp);
                }
                imagescount++;
            }
        }

这是一个错误: enter image description here

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

sscanf()仅适用于标准的C 0终止字符串。 fread()不会将0附加到它所读取的内容。如果要读取8个字节并使用sscanf(),则需要首先对数据进行0终止。所以你的数组需要至少9个字节,所以你可以在数据上附加一个0。

此外,您需要将变量地址传递给它,以便它可以写入它们。

所以看起来应该更像这样:

FILE *fp;
int i,j;
char str[9] = { 0 };
char valor;
if(!(fp = fopen("miniflota_g.dat","rb"))){
    printf("Error opening file.");
    getch();
    return;
}
while(fread(str,sizeof(str)-1,1,fp) == 1){
    sscanf(str,"%d %d %c",&i,&j,&valor);
    printf("%d %d %c",i,j,valor);
}
fclose(fp);

答案 1 :(得分:1)

  1. 你永远不会终止' str'所以sscanf可以读完。

  2. 您需要将输出变量的地址传递给sscanf,而不是值。 (例如。&i代替i)。

  3. 如果您启用编译器警告(-Wall with gcc),编译器将至少警告您第二点。