2014-06-18 88 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