2014-01-26 6 views
-1

EDITED: Я в строго-C-среде. Любые коды C++ не будут работать. Я в среде, где я не могу отлаживать. Я просто смог скомпилировать и удалить программу всех ошибок. Извините, если я кажусь строгим, я просто работаю в такой среде. Любая помощь ценится!Ошибка при передаче указателя строки на fopen

У меня есть файл с именем namefi.txt, который имеет всю строку имен файлов после строки. Каждая строка имеет только одно имя файла, поэтому я использую strtok для удаления всех пробелов и просто беру имя файла, которое я передаю в FOPEN. Но просто кажется, что f-open не принимает его. Он создает файл output.txt и даже переименовывает его в нужное имя (хотя до имени name_ne.txt - не уверен, почему «w» отсутствует, «имя» имеет длину всего четыре символа, но все равно), но когда я откройте файл, все, что я вижу, это «Ошибка открытия файла Naren.txt». Если я прокомментирую часть namefi программы и часть переименования, она выписывает из входного файла выходной файл. Дело в том, что часть, где требуется имя файла из namefi.txt и его открытие, не происходит. Любая помощь вообще была бы оценена. Вот мой код.

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
void main() 
{ 
    FILE *inpfi, *outfi, *namefi,newna; 
    char buf[132], name[132], *trim; 
    namefi = fopen("Namefi.txt", "r"); 
    while(frets(name, 132, namefi)!=NULL) 
    { 
     trim = strtok(name," "); 
     inpfi = fopen(trim, "r"); 
     outfi = fopen("OUTPUT.txt", "w"); 
     if(!inpfi) 
      fprintf(outfi, "File open error: %s", trim); 
     while(fgets(but,132,inpfi)!=NULL) 
      fprint(outfi, "%s", buf); 
     newna = strtok(trim, "."); 
     newna = strcat(newna,"_new.txt"); 
     rename("OUTPUT.TXT", newna); 
     fclose(inpfi); 
     fclose(outfi); 
    } 
} 
+2

Скомпилируйте все предупреждения и информацию об отладке (возможно, с помощью 'gcc -Wall -g'). ** Используйте отладчик ** (например, 'gdb'). Проверьте все ваши вызовы на libc-функции (например, 'fopen'). Используйте «perror» для отображения кода ошибки. Расскажите нам о своем компиляторе, операционной системе, файловой системе ....И «лады», вероятно, должны быть «fgets»; также, пожалуйста, отпечатайте свой код, чтобы сделать его более читаемым. –

+0

@BasileStarynkevitch Спасибо за ваш комментарий. Я отредактировал вопрос. И про отступ, я дал ctrl + k. Не уверен, почему он не работает. :(Извините. –

+0

Просто введите соответствующее количество пробелов в код отступа. В системе Linux вы также можете использовать: 'indent source.c', затем' sed 's/^//' source.c' -there четыре пробела между вторым и третьим '/' - и копировать-вставить вывод этой команды 'sed' .... –

ответ

1
  1. FILE *inpfi, *outfi, *namefi,newna; 
    

    newna не хватает *.

  2. while(frets(name, 132, namefi)!=NULL) 
    

    frets должен быть fgets

  3. trim = strtok(name," "); 
    inpfi = fopen(trim, "r"); 
    

    Вы начинаете свое имя файла при первом появлении пространства, я сомневаюсь, что это предназначено.

  4. outfi = fopen("OUTPUT.txt", "w"); 
    

    перезаписывается в каждой итерации цикла OUTPUT.txt. Вероятно, вы хотите использовать "a" вместо "w" или открыть файл до записи цикла.

  5. while(fgets(but,132,inpfi)!=NULL) 
    

    but должен быть buf.

  6. fprint(outfi, "%s", buf); 
    

    fprint должен быть fprintf.

  7. newna = strtok(trim, "."); 
    

    Почему вы используете newna теперь, как char* когда вы объявили его в качестве FILE (или FILE*, как я предполагаю, что это должно быть)

  8. rename("OUTPUT.TXT", newna); 
    fclose(inpfi); 
    fclose(outfi); 
    

    Вы переименовать файл, прежде чем закрыть его. Я точно не знаю, что такое поведение в этом случае, но я сомневаюсь, что это хорошая идея.

Большинство ошибок, о которых я упоминал, можно было бы легко избежать путем проверки показаний, проверки редакторов или предупреждений/ошибок компилятора. Ваш код, как вы его разместили, конечно, не компилируется.

+0

Извините, я допустил ошибку при публикации из предыдущего файла. Я нашел ошибку. Это было из-за пространства, которое я оставил в файле namefi. выступать в качестве разделителя.Я изменил пространство на «», где «.» действовал как разделитель, и он работал. Эти ошибки, о которых вы говорили, были исправлены, но большое спасибо @nabla. :) –

Смежные вопросы