2014-06-18 53 views
-4

你好,我有一个小问题,我还找不到解决方案。我有一个文件(data.txt中)与下一个信息:“覆盖”文件中的重复值(C)

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 

我试图与附配的文件,但不能得到解决,我会因此与任何帮助apreciated。

我可以将两条线中的任何一条设置为0,但不能同时设置两条,如果同一条线出现两次以上,则可以设置相同。

+3

请张贴你已经写的代码。 – pts

+0

输入文件中矩阵的宽度和高度是多少?它总是一样的宽度?它总是一样的高度吗? – pts

+1

你的问题是什么?你对我们有什么期望? – this

回答

1

可以实现通过:

  • 打开上"r+"模式第一
  • 从由行的文件线系统地获得字符转换成字符数组的数组
  • 比较线的输入/输出文件在配对时将除逗号之外的字符设置为零字符
  • 在文件中寻找
  • 将行写回到fi乐,他们与新线

正确检测配对分离,你可能遵循以下逻辑:

  • 挑一条线,与它一起创建一个变量,并将其设置为1
  • 将该行与其他行进行比较
  • 如果匹配,请将该变量设置为0并继续比较您的行与其余的行
  • ...直到结束,取代非公司MMA字符为零字符,每场比赛
  • 与他们所有的检查后,修改或取决于你已经设置为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; 
} 
+0

它完美地工作,非常感谢! –

+1

@LuisIbarra不客气,但这真的不是你应该在这里问问题的方式。你应该展示你一直在尝试的失败尝试。我真的不应该这样回答,但我反正做了,因为我认为它可能有帮助,我有时间。 – ThoAppelsin