gpt4 book ai didi

c - "Overwrite"文件中的重复值 (C)

转载 作者:行者123 更新时间:2023-11-30 21:25:57 25 4
gpt4 key购买 nike

你好,我有一个小问题,但我还没有找到解决方案。我有一个包含以下信息的文件 (data.txt):

5,5,6,2,5,2
1,4,2,3,7,2
4,2,5,2,3,4
5,5,6,2,5,2
4,5,2,6,2,4
2,1,5,6,3,2

我想将所有重复行设置为 0,例如:5,5,6,2,5,2 出现两次,因此最终文件必须如下所示:

0,0,0,0,0,0
1,4,2,3,7,2
4,2,5,2,3,4
0,0,0,0,0,0
4,5,2,6,2,4
2,1,5,6,3,2

我尝试过使用辅助文件,但无法得到解决方案,如果有任何帮助,我将不胜感激。

我可以将两行中的任何一行设置为 0,但不能将它们都设置为 0,如果同一行出现两次以上,则效果相同。

最佳答案

您可以通过以下方式实现这一目标:

  • 首先在“r+”模式下打开输入/输出文件
  • 系统地从文件中逐行获取字符到字符数组的数组中
  • 相互比较行,配对时将逗号以外的字符设置为零字符
  • 在文件中查找
  • 将各行写回到文件中,并用新行分隔

要正确检测配对,您可以遵循以下逻辑:

  • 选择一行,创建一个变量并将其设置为1
  • 将该行与其他行进行比较
  • 如果匹配,请将变量设置为 0 并继续将您的行与其余行进行比较
  • ...直到最后,每次匹配时将非逗号字符替换为零个字符
  • 检查完所有内容后,根据您最初设置为 1 的变量的状态修改或不修改您最初选择的行

这是一个有效的代码,除非内存不足,否则应该可以正常工作:

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

void settozero( char * line ) {
for ( int i = 0; line[i] != '\0'; i++ )
if ( line[i] != ',' )
line[i] = '0';
}

int main( ) {

char ** lines = NULL;
FILE * input;

if ( ( input = fopen( "input", "r+" ) ) == NULL ) {
printf( "error at line %d", __LINE__ );
return -1;
}

int currentchar;
int newline = 1;
int linecount = 0;
int lineindex;
int linesize;
while ( ( currentchar = fgetc( input ) ) != EOF ) {
if ( newline ) {
linecount++;
lineindex = 0;
linesize = 128;
lines = realloc( lines, linecount * sizeof * lines );
lines[linecount - 1] = malloc( linesize );
newline = 0;
}
if ( lineindex == linesize ) {
linesize *= 3;
lines[linecount - 1] = realloc( lines[linecount - 1], linesize );
}
if ( currentchar == '\n' ) {
newline = 1;
currentchar = '\0';
}
lines[linecount - 1][lineindex++] = currentchar;
}

if ( !newline ) {
if ( lineindex == linesize )
lines[linecount - 1] = realloc( lines[linecount - 1], linesize + 1 );
lines[linecount - 1][lineindex] = '\0';
}

int * linestoskip = calloc( linecount, sizeof * linestoskip );

for ( int i = 0; i < linecount; i++ ) {
if ( linestoskip[i] )
continue;

int unique = 1;
for ( int j = i + 1; j < linecount; j++ ) {
if ( linestoskip[j] )
continue;

if ( strcmp( lines[i], lines[j] ) == 0 ) {
unique = 0;
settozero( lines[j] );
linestoskip[j] = 1;
}
}
if ( !unique )
settozero( lines[i] );
}

free( linestoskip );
fseek( input, 0L, SEEK_SET );

for ( int i = 0; i < linecount; i++ ) {
for ( int j = 0; lines[i][j] != '\0'; j++ ) {
fputc( lines[i][j], input );
}
if ( i != linecount - 1 || newline )
fputc( '\n', input );
free( lines[i] );
}

free( lines );

putchar( 10 );
return 0;
}

关于c - "Overwrite"文件中的重复值 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24296400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com