2015-10-04 103 views
0

我在函數「menor」中的fprintf存在問題,因爲數據在所選文件中不可見,我不知道什麼是問題,請幫助,我認爲是參考文件,但不是想法。fprintf in文件未找到

我在函數「menor」中的fprintf存在問題,因爲數據在所選文件中不可見,我不知道是什麼問題,請幫忙,我認爲是參考文件,但不是想法

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


    typedef struct { 
     char * nombre; 
     char * editorial; 
     int valor; 
     int area; 
     int vendido; 
    } 
Libro; 

int conteo(FILE * _entrada); 
void datos(FILE * _entrada, Libro * _trabajo, int cantidad); 
void menor(FILE * _entrada, FILE * _salida, Libro * _trabajo, int cantidad); 

int main() { 
    FILE * entrada; 
    char ingreso[256]; 
    printf("Direccion del archivo de entrada \n"); 
    scanf("%255s", ingreso); 
    entrada = fopen(ingreso, "r"); 
    if (entrada == NULL) { 
     printf("No se pudo acceder al archivo de entrada \n"); 
     exit(1); 
    } 
    FILE * salida; 
    char final[256]; 
    printf("Direccion del archivo de salida \n"); 
    scanf("%255s", final); 
    salida = fopen(final, "r"); 
    if (salida == NULL) { 
     printf("No se pudo acceder al archivo de salida \n"); 
     exit(1); 
    } 
    int cantidad = conteo(entrada); 
    Libro * trabajo; 
    trabajo = (Libro *) malloc(sizeof(Libro) * cantidad); 
    datos(entrada, trabajo, cantidad); 
    menor(entrada, salida, trabajo, cantidad); 
    return 0; 
} 

int conteo(FILE * _entrada) { 
    char auxiliar1[100]; 
    int conteo = 0; 
    while (!feof(_entrada)) { 
     fgets(auxiliar1, 100, _entrada); 
     conteo++; 
    } 
    rewind(_entrada); 
    return (conteo/5); 
} 

void datos(FILE * _entrada, Libro * _trabajo, int cantidad) { 
    char auxiliar2[100]; 
    char * token; 
    while (!feof(_entrada)) { 
     fgets(auxiliar2, 100, _entrada); 
     token = strtok(auxiliar2, ":"); 
     token = strtok(NULL, ":"); 
     (_trabajo - > nombre) = strdup(strtok(token, "\n")); 

     fgets(auxiliar2, 100, _entrada); 
     token = strtok(auxiliar2, ":"); 
     token = strtok(NULL, ":"); 
     (_trabajo - > editorial) = strdup(strtok(token, "\n")); 

     fgets(auxiliar2, 100, _entrada); 
     token = strtok(auxiliar2, ":"); 
     (_trabajo - > valor) = atoi(strtok(NULL, ":")); 

     fgets(auxiliar2, 100, _entrada); 
     token = strtok(auxiliar2, ":"); 
     (_trabajo - > area) = atoi(strtok(NULL, ":")); 

     fgets(auxiliar2, 100, _entrada); 
     token = strtok(auxiliar2, ":"); 
     (_trabajo - > vendido) = atoi(strtok(NULL, ":")); 
    } 
} 




void menor(FILE * _entrada, FILE * _salida, Libro * _trabajo, int cantidad) { 
    int i; 
    int menor = 0; 
    int posicion = 0; 
    for (i = 0; i < cantidad; i++) { 
     if ((_trabajo - > area) == 1) { 
      menor = (_trabajo - > vendido); 
      _trabajo++; 
     } 
    } 
    _trabajo--; 
    fprintf(_salida, "%s", (_trabajo - > nombre)); 
} 
+0

請解釋錯誤。它是運行時錯誤還是邏輯錯誤?同時說明你的代碼的目的。這將有助於我們進一步爲您提供建議。 – SanVed

+0

邏輯錯誤,因爲當我在函數「menor」中創建一個FILE時,他寫的是正確的,但在這種情況下,我需要在主文件中創建一個FILE,因爲我需要在另一個函數中寫入此FILE,但不寫入任何內容FILE –

回答

1

在主,變化:

salida = fopen(final, "r"); 

分爲:

salida = fopen(final, "w"); 

這將真理的美食文件。如果你想更新該文件(意思是改變現有文件的內容而不刪除它),你會想要「r +」。

0

您對問題的描述很模糊。請更新您的問題,向我們顯示確切(複製並粘貼)的錯誤消息。

但是,當我編譯你的程序,我得到:

c.c:1:26: fatal error: stdio.h : No such file or directory 
    #include <stdio.h> 
         ^
compilation terminated. 

#include指令刪除空格。更改此:

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

這樣:

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

<>的名字的解釋是編譯器特定的,但在這種情況下,編譯器可能是在尋找他的名字是一個文件字面意思是" stdio.h ",包括前後空格。)

+0

描述不是含糊不清,解決方案也不是。問題描述是帖子的第一行。這意味着程序運行[不是編譯錯誤],而是輸出文件爲空。 BTW,OP確實發佈了整個文件。你正在琢磨的錯誤是微不足道的,SO並不總是完美的格式化代碼示例。看到我的答案 - 我只是根據帖子的第一行進行代碼/案頭檢查。你的答案是完全錯誤的,OP在你的回答之前澄清了他的一個評論中的實際運行時問題。 –

+0

@CraigEstey:你可能是對的,但我仍然發現問題和評論含糊不清。對該問題的第一條評論提出「是運行時錯誤還是邏輯錯誤」; OP回覆說這是一個「邏輯錯誤」。這是否意味着問題不會在運行時發生?我不知道。在任何情況下,OP都需要顯示錯誤消息(如果有),或者程序輸出(如果沒有)。 '#include'指令中的額外空格可能表示OP重新輸入了代碼,而不是複製並粘貼它。如果是這樣,他需要向我們展示實際的代碼。 –

+0

剪切OP鬆弛(eng不是第一個lang),並將第1個句子「選擇的文件」改寫爲「爲輸出選擇的文件」。 Prob 1st post並不知道ctrl-k,所以他試圖發佈html格式,然後再編輯回來 - 我也是第一次這樣做。還請注意「 - >」而不是「 - >」 - 他做了s /> />/g等代碼構建並運行小錯字修正。這是真正的代碼。程序會提示輸入兩個文件然後運行。輸出文件將爲空,並且不會顯示錯誤消息。國際海事組織,S/O的CTRL-K是braindamaged。它還需要「從上傳的文件粘貼」 - 可能會阻止輸入錯誤 –