2016-02-17 198 views
-1

我有一個文件test.txt它看起來像這樣:從文件讀取並打印到另一個文件

5 6 
sugli* 
odiati 
tiri*n 
tri*cd 
oe*poi 

前兩個數字陣列空間維度中,所有這些詞都被投入。

以下任務的代碼是(FILEIN的test.txt文件):現在創建

int row, col; 
fscanf(fileIn, "%d %d%*c", &row, &col); 
int cruciverba[row][col]; 

for (int i = 0; i < row; i++) { 
    for (int j = 0; j < col; j++) { 
     cruciverba[i][j] = fgetc(fileIn); 
    } 
    char space = fgetc(fileIn); 
} 

陣列。現在我應該編寫一個將字符串寫入另一個文件的函數(或更多),但不是數組中的每個字符串,只是水平和垂直長度> = 2的字符串。請注意0​​是字符串分隔符。 的目標是有一個包含這些字符串一個output.txt的文件:

sugli 
odiati 
tiri 
tri 
cd 
oe 
poi 

sotto 
udire 
giri 
lai 
it 
co 
indi 

我知道如何輸出字符串,但我沒有任何想法如何處理這一問題。任何建議?

+2

你沒有字符串。您沒有在每行字符末尾留下* nul-terminating *字符的空格(例如'col + 1')。你有*字符數組*。你可以用'fputc'把它們寫出來。 –

+0

我必須在將它們放出之前檢查它們的長度。這就是我不知道如何解決的問題 – Matt95

+0

這是你必須對此有點聰明的地方。我建議在讀取每個單詞之後留出空間給* nul-terminating *字符並寫入* nul-terminating *字符('0'),以使它們成爲字符串。否則,您需要存儲每個單詞的長度。 (你通常把它作爲每行中的'1st'字符存儲 - 意思是讀取單詞中的每個字符並在'1'開始'j'的保存循環,然後當你讀取最後一個字符時,將'cruciverba [ i] [0] = j')當你用'fputc'將它們寫出來時,使用'for(j = 1; j

回答

0
#define TRIGGER '*' 

void out(FILE *fileOut, char *buff, int value){ 
//this function is output buffer 
    static int pos = 0; 
    if(value == TRIGGER){ 
     buff[pos] = '\0'; 
     if(pos >= 2) 
      fprintf(fileOut, "%s\n", buff); 
     pos = 0; 
    } else { 
     buff[pos++] = value; 
    } 
} 

...

//在主

FILE *fileOut = fopen("out.txt", "w"); 
int side[2] = {row, col}; 
for(int s = 0; s < 2; ++s){ 
    char buff[side[s]+1]; 
    *buff = 0; 
    for (int i = 0; i < side[s]; i++) { 
     for (int j = 0; j < side[1-s]; j++) { 
      out(fileOut, buff, s ? cruciverba[j][i] : cruciverba[i][j]); 
     } 
     out(fileOut, buff, TRIGGER); 
    } 
    fprintf(fileOut, "\n"); 
} 
fclose(fileOut); 
0

這個問題的目的是折磨你在多個層面。從以字符爲導向輸入,字符數組與字符串理解,數組索引,文本文件格式以及大量其他細微問題,旨在強制您專注於逐字符級別。

首先必須包含隨後的每個7-characters5-rows(你必須考慮'\n'字符終止每行)你的數組邊界您的數據文件。您的陣列存儲爲5-row,作者爲6-col。這意味着從以字符爲導向的輸入角度來看,您必須考慮'\n'的讀取,而忽略數據/索引的角度。

注:,而這個問題的意圖似乎有你讀成二維數組,你可以讀字符的row*col成一維數組,以及 - 這種做法並非沒有挑戰,要麼)

導航讀入陣列後,你面對輸出陣列,而只考慮[A-Za-z]alpha)字符作爲每一行的一部分,'*'字符作爲'\n'和每一行作爲'\n'的端部以及。

有沒有簡單的方法或一個正確的方法來解決這個問題。無論你如何做,這是你必須真正關注索引體操,以達到提供正確輸出的例程。下面的方法使用一個7-char緩衝區和一個緩衝區索引緩衝每個想要的字符,並在滿足所有條件(例如'*'或達到行尾)時將緩衝區寫入stdout。以下是解決問題的一種方法的評論示例。我已經把操作的第二部分留給了你,但是通過這裏和BLUEPIXY提供的例子,你有幾個例子說明你必須處理索引。例如:

#include <stdio.h> 
#include <ctype.h> 

int main (int argc, char **argv) { 

    int row, col, i, idx, j, c; 
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin; 

    if (!fp) { /* validate file open for reading */ 
     fprintf (stderr, "error: file open failed '%s'.\n", argv[1]); 
     return 1; 
    } 
    row = col = i = idx = j = c = 0; /* initialize all values */ 

    /* validate row and col data read */ 
    if (fscanf (fp, "%d %d%*c", &row, &col) != 2) { 
     fprintf (stderr, "error: invalid read of row/col.\n"); 
     return 1; 
    } 

    char cruciverbal[row][col]; /* variable length array to data */ 
    char buf[col+1];   /* buffer to assist in printing */ 

    for (i = 0; i < row; i++) {   /* for each row in array */ 
     for (j = 0; j < col; j++) {  /* for each char in row */ 
      if ((c = fgetc (fp)) == EOF) /* jump if EOF */ 
       goto readdone; 
      else { 
       cruciverbal[i][j] = c; /* store char in array */ 
      } 
     } 
     fgetc (fp); /* discard newline in file */ 
    } 
readdone: 

    if (fp != stdin) fclose (fp); /* close file if not stdin */ 

    /* print characters to stdout */ 
    for (i = 0; i < row; i++) { 
     for (j = 0; j < col; j++) { 
      if (isalpha (cruciverbal[i][j])) /* if [A-Za-Z] */ 
       buf[idx++] = cruciverbal[i][j]; /* buffer char */ 
      else { 
       if (idx > 1) {   /* check if buffer > 1 */ 
        buf[idx] = 0;  /* nul-terminate buffer */ 
        printf ("%s\n", buf); 
        idx = 0;   /* reset buffer index */ 
       } 
       else {     /* if buf < 2, print \n */ 
        fputc ('\n', stdout); 
        continue; 
       } 
      } 
     } /* if last char in row is [A-Za-z] */ 
     if (isalpha (cruciverbal[i][j-1])) { 
      if (idx > 1) { 
       buf[idx] = 0;   /* nul-terminate buffer */ 
       printf ("%s\n", buf); 
      } 
      else if (idx == 0)   /* if buffer empty */ 
       fputc ('\n', stdout); /* output newline */ 
     } 
     idx = 0;      /* reset buf index */ 
    } 

    return 0; 
} 

使用/輸出

$ ./bin/cruciverbal <../dat/56array.txt 
sugli 
odiati 
tiri 
tri 
cd 
oe 
poi 

過目兩個答案,讓我們知道,如果您有任何問題。

相關問題