从一个博客的回复上看到的,学习之后加了注释。源代码来自csdn博客。
通过这段代码学习到fgets实现从文件中一行一行读,fputs实现把每次读到的内容原样写到一个文件中,strstr查找包含某个xxx内容的字符串,feof判断文件末尾,#if #else #endif预编译命令,通过写bat文件向编译好的文件传入main函数的参数(这个同样可以通过在Project中设置实现向main函数传参数),实际上使用bat文件和在cmd使用dos命令作用是相同的,这里就相当于在cmd下cd进入到exe文件夹下,然后敲入xxx.exe arg[1] arg[2],其中后面为传入main函数的两个参数常用的c的文件操纵函数还有
//printf fprintf
//scanf fscanf
//getc fgetc
//putc fputc
//gets fgets
//puts fputs
//fread fwrite
//fseek fgetpos feof
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <Windows.h>
using namespace std;
#define DST_FILE "dst.txt"
#define SRC_FILE "src.txt"
//assume that every line is not larger than 256 bytes
#define MAX_LEN 256
static char achBuf[MAX_LEN] = {0};
static int RemoveSameStringLine(int argc, char **argv)
{
FILE *fpSrc = NULL;
FILE *fpDst = NULL;
char achStr[50] = {0};
int nCount = 0;
int nArgc = 0;
char achSrcF[50] = {0};
#if 1
//argc the number of parameter, here must more than 2
if (argc < 2)
{
printf("parameter is less than < 2\n");
return -1;
}
strcpy(achSrcF, argv[1]);
strcpy(achStr, argv[2]);
printf("argc: %d\n", argc);
for (nArgc = 0; nArgc < argc; nArgc++)
{
printf("argv[%d]: %s\n", nArgc, argv[nArgc]);
}
for (nArgc = 3; nArgc < argc; nArgc++)
{
strcat(achStr, " ");
strcat(achStr, argv[nArgc]);
}
#else
strcpy(achSrcF, SRC_FILE)
strcpy(achStr, SEEK_STR);
printf("argv:[0]-%s,[1]-%s,[2]-%s\n", argv[0], SRC_FILE, SEEK_STR);
#endif
printf("File:%s find str:\"%s\", and remove this str line\n", achSrcF, achStr);
fpSrc = fopen(achSrcF, "rt");
if (NULL== fpSrc)
{
printf("Open source file: %s failed\n", SRC_FILE);
return -1;
}
fpDst = fopen(DST_FILE, "wt");
if (NULL== fpDst)
{
printf("Create source file: %s failed\n", DST_FILE);
fclose(fpSrc);
return -1;
}
nCount = 0;
while (!feof(fpSrc))
{
memset(achBuf, 0, sizeof(achBuf));
//Get a string from a stream. the first parameter is the string, the second is the length of the string
//the third parameter is the File stream
//fgets reads characters from the current stream position
//to and including the first newline character, to the end of the stream,
//or until the number of characters read is equal to n – 1, whichever comes first.
//The newline character, if read, is included in the string.
//so if we want to read a file line by line, we can use this function, and in almost every time we make the
//size of the buffer larger than the bytes of the most long line, and actually every time we can read a Enter
//identifier from every line
//通过对比ASCII码表,进行试验后发现,换行就是真的换了一行,
//而回车只是一个字符而已,所以每个文件中的回车符可以通过char == "\n"来得到,换行符也是一个char型的ascii码
fgets(achBuf, sizeof(achBuf), fpSrc);
//Each of these functions returns a pointer to the first occurrence of strCharSet in string,
//or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.
if (NULL == strstr(achBuf, achStr))
{
//Write a string to a stream. the first parameter is the string, and the second is the stream
fputs(achBuf, fpDst);
}
else
{
nCount++;
}
}
fclose(fpSrc);
fclose(fpDst);
printf("Total Count Same string:%d\n", nCount);
return 0;
}
int main(int argc, char *argv[])
{
int nRet;
nRet = RemoveSameStringLine(argc, argv);
printf("RemoveSameStringLine-ret:%d\n", nRet);
Sleep(6000);
return 0;
}
之后在编译好的exe文件同文件加下拷贝入源文件src.txt,之后写bat文件 xxx.exe src.txt delstringxxx即可