C从文件中获取字符串

时间:2013-12-13 23:37:55

标签: c fread fseek fputs

我想从文件中获取2个固定长度的变量字符串(10个字符串和32个字符串)并将它们保存为变量,以便稍后在我的程序中传递并将它们写入新文件。我可以从用户输入将数据写入新文件,但我似乎无法确定如何定位数据并将其存储以供使用,因此用户无需手动输入42个字符和风险错误。字符串的内容会有所不同,并且文件中的位置可能会有所不同,但总是会出现一个常量字符串“Serial Number =”。如果存在蜇伤的已知偏移位置,这会更容易吗?我在想fget或fread ......但我无法得到一个有效的例子。

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

int main(void)

{
FILE *f;
FILE * pFile;
char sn[11];
char uuid[33];

  if (f = fopen("test.txt", "rt"))
  {
    fseek (f,443,SEEK_SET);  //file offset location to begin read
    fread(uuid, 1, 32, f);   //Read the data of 32 chars
    uuid[32] = 0;
    fseek (f,501,SEEK_SET);  //file offset location to begin read
    fread(sn, 1, 10, f);     //Read the data of 10 chars
    sn[10] = 0;
    fclose(f);  //Close our file
    printf("The 32 character UUID:\n%s\n", uuid);  //Show read/extracted Data
    printf("The 10 character SN:\n%s\n", sn);      //Show read/extracted Data

    pFile = fopen ("testfile.exe","r+b");   //Open binary file to inject data

    fseek (pFile,24523,SEEK_SET);    //1st file offset location to begin write
    fputs (sn,pFile);                //Write our data!

    fseek (pFile,24582,SEEK_SET);    //2nd file offset location to begin write
    fputs (uuid,pFile);              //Write our data!

    fseek (pFile,24889,SEEK_SET);    //3rd file offset location to begin write
    fputs (uuid,pFile);              //Write our data!

    fclose(pFile);                  //Close our file

    printf ("Finished\n");
    }
return(0);
}

我整个周末都在工作和阅读,我现在得到了预期的结果,从一个文件读取数据并注入另一个文件。虽然这有效,但它可能不是最好的方法。我提前为错误标记的帖子道歉,我从手机上提交并且没有访问我的来源。感谢所有的投入。我更欢迎。我试着记录,因为我明白我在做什么。

2 个答案:

答案 0 :(得分:0)

你可以使用fgetc并在一个字符串中计算每个字符,然后说c ==“”表示另一个字并重置你的计数。

答案 1 :(得分:0)

虽然您的解决方案有效,但您可能会发现实际上不必预先确定字符串开始的"test.txt"中的偏移量,而是让程序搜索它们,例如: G。使用

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

void find(FILE *f, const char *s)
{   // searches stream f for string s, positions f after s
    int c;
    long offset;
    const char *cp;
    for (; ; )
    for (offset = ftell(f), cp = s; ; ) // save starting point
        if (!*cp) return;   // at end of search string - found
        else
        if ((c = fgetc(f)) == *cp) ++cp;    // character match
        else
        if (c == EOF) printf("\"%s\" not found\n", s), exit(EXIT_FAILURE);
        else
        if (cp > s) { fseek(f, offset, SEEK_SET), fgetc(f); break; }
}

并替换

    fseek (f,443,SEEK_SET);  //file offset location to begin read

    fseek (f,501,SEEK_SET);  //file offset location to begin read

    find(f, "UUID =");          // really no space after "="?

    find(f, "Serial Number ="); // really no space after "="?

分别