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